Apacheのログをrsyslog経由でDB(MySQL)に保存する

IT

このblogが動作しているVPSで、ディスクスペースも余りまくっているので、
長期的にログを保存・分析することを考え、Apacheのログをrsyslog経由で
MySQLに保存する設定をやってみました。

参考にしたのは以下のサイトです。
世の先人たちに感謝です。

・rsyslog のログをMySQLに保存するための設定について

rsyslog のログを DB で管理する ( MySQL / PostgreSQL )
http://sios-oss.blogspot.jp/2012/11/rsyslog-db-mysql-postgresql.html

・Apache のログを rsyslog に集約するための設定について

Apache/バーチャルホストのログをリモートのrsyslogに集約する – maruko2 Note.
http://goo.gl/m8gPY1

基本的に参考にしたサイトのまんまではありますが、rsyslog を使用するといっても、
VPS 1台 の中だけで完結させるので、よくあるリモートサーバへログを転送して・・・
ということにはなっていません。あらかじめ、ご注意ください。

前提条件

  1. Apache がインストールされていること
  2. MySQL がインストールされていること
  3. rsyslog がインストールされていること
  4. OS は CentOS であること

4 の条件は、単に私が使用しているVPSのOSがCentOSだったというだけです。
Apache、MySQL、rsyslog がインストールできる環境であれば、問題ないかと思います。
1~3 の条件は、インストール手順は他のサイトでたくさん紹介されているので、省略し
ますよということですw

rsyslog のログを MySQL に保存する設定

rsyslog のログを MySQL に保存するために、この両者をつなぐためのパッケージをイン
ストールします。yum コマンドを使用します。

[plain]# yum install rsyslog-mysql
[/plain]

次に rsyslog のログを保存するためのテーブルを作成します。
先ほどのパッケージをインストールしたときに、使用できるスクリプトが配置されてい
るので、それを利用します。

[plain]mysql -u root -p < /usr/share/doc/rsyslog-mysql-5.8.10/createDB.sql
[/plain]

/usr/share/doc以下のパス、ファイル名はインストールした環境によって変わると思い
ますので、ご注意ください。

ちゃんとテーブルが作成されたか確認してみます。

[plain]# mysql -u root -p
(省略)
mysql > show databases;
+——————–+
| Database |
+——————–+
| information_schema |
| Syslog |
| mysql |
| test |
| wordpress |
+——————–+
5 rows in set (0.00 sec)
mysql> use Syslog;
mysql> show tables;
+————————+
| Tables_in_Syslog |
+————————+
| SystemEvents |
| SystemEventsProperties |
+————————+
2 rows in set (0.01 sec)
[/plain]

”Syslog” というデータベースが含まれており、テーブルとして2つ作成されて
いれば成功です。

さて、rsyslog のログを格納するテーブルが作成できたので、そのテーブルに対
して操作できるユーザを作成します。

[plain]GRANT ALL PRIVILEGES ON Syslog.* TO username@localhost IDENTIFIED BY ‘password’
[/plain]

username及び、password は、任意で設定してください。

このセクションでは最後になりますが、rsyslog.conf に DB へログを保存する
ための設定を追加します。

[plain]$ModLoad ommysql
*.* :ommysql:localhost,Syslog,username,password
[/plain]

2行目のusername及び、password には、先ほどMySQLに作成したユーザと
それに設定したパスワードを記述します。

設定を反映させるために rsyslog を再起動します。

[plain]# service rsyslog restart[/plain]

ちゃんとrsyslog のログがDBに保存されたか確認します。

[plain]# mysql -u rsyslog -p Syslog
mysql> select * from SystemEvents;
[/plain]

rsyslog のログが保存されていれば、設定はOKです。

[plain]+—-+————+———————+———————+———-+———-+—————-+—————————————————————————————————-+————+————+————-+———–+—————+———+—————–+————–+———–+———-+———-+————+———–+————–+—————–+———-+
| ID | CustomerID | ReceivedAt | DeviceReportedTime | Facility | Priority | FromHost | Message | NTSeverity | Importance | EventSource | EventUser | EventCategory | EventID | EventBinaryData | MaxAvailable | CurrUsage | MinUsage | MaxUsage | InfoUnitID | SysLogTag | EventLogType | GenericFileName | SystemID |
+—-+————+———————+———————+———-+———-+—————-+—————————————————————————————————-+————+————+————-+———–+—————+———+—————–+————–+———–+———-+———-+————+———–+————–+—————–+———-+
| 1 | NULL | 2014-05-10 15:13:05 | 2014-05-10 15:13:05 | 0 | 6 | ホスト名 | imklog 5.8.10, log source = /proc/kmsg started. | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 1 | kernel: | NULL | NULL | NULL |
| 2 | NULL | 2014-05-10 15:13:05 | 2014-05-10 15:13:05 | 5 | 6 | ホスト名 | [origin software="rsyslogd" swVersion="5.8.10" x-pid="662" x-info="http://www.rsyslog.com"] start | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 1 | rsyslogd: | NULL | NULL | NULL |
+—-+————+———————+———————+———-+———-+—————-+—————————————————————————————————-+————+————+————-+———–+—————+———+—————–+————–+———–+———-+———-+————+———–+————–+—————–+———-+
2 rows in set (0.00 sec)
[/plain]

Apache のログを rsyslog へ渡す設定を行う

httpd.conf を編集します。

[plain]ErrorLog syslog:local1
LogLevel warn
LogFormat "%v %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" vcombined
CustomLog |/usr/local/bin/apache_syslog.pl vcombined
[/plain]

次に Perlスクリプト apache_syslog.pl を /usr/local/bin に作成します。

[perl]#!/usr/bin/perl
use Sys::Syslog qw( :DEFAULT setlogsock );

setlogsock(‘unix’);
openlog(‘apache’, ‘cons,pid’, ‘local0’);

while ($log = <STDIN>) {
syslog(‘debug’, $log);
}
closelog
[/perl]

 

スクリプトを作成したら、実行できるように設定します。
私はこれをしなかったのでちょっとハマりましたw

[plain]chmod 755 apache_syslog.pl
[/plain]

rsyslog.conf に設定を追加します。

[plain]$template MsgFormat, "%msg:2:$%\n"
$template httpd_access, "/var/log/rsyslog/%msg:F,32:2%/httpd_access_%$year%%$month%%$day%.log"
$template httpd_error, "/var/log/rsyslog/%fromhost-ip%/httpd_error_%$year%%$month%%$day%.log"

local0.debug -?httpd_access;MsgFormat
local1.debug -?httpd_error;MsgFormat
[/plain]

最後に、rsyslog、Apache を再起動します。

[plain]# service rsyslog restart
# service httpd restart
[/plain]

これで設定は終了です。
あとは自分でサイトにアクセスしてみて、MySQLにログが保存されたか
確認してください。

まあ、これで何をするってわけではないけど、ログ解析とかできるかなー
くらいですがw

 

コメント

タイトルとURLをコピーしました