Apacheのログをrsyslogで集中させる
現行環境ではウェブのフロントエンドは2台でしたが、入れ替え作業中の新しい環境では4台に増えます。
いままではログを解析するのに片方へコピーして日付順にソートしてなどと面倒なことをやっていたんですが、さすがに四台ともなるとそんなこともやってられません。
そこでrsyslogを使ってログを一台の計算機に集中させることにしました。
参考、というかこの記事のとおりにやりました。ありがとうございます。
受取側rsyslogの設定
/etc/rsyslog.confを編集します。設定項目は以下のとおり。
$ModLoad imuxsock $ModLoad imtcp $InputTCPServerRun 514 $RepeatedMsgReduction off $template MsgFormat, "%msg:2:$%\n" $template httpd_access, "/var/log/httpd/httpd_access_%$year%%$month%%$day%.log" $template httpd_error, "/var/log/httpd/httpd_error_%$year%%$month%%$day%.log"
tcpでだけ通信するのでudpの設定は不要。下の二行はそれぞれログの実体の場所と、ファイル名フォーマット。ヴァーチャルホスト単位でログを分けたり、ソースIPで分けたりいろいろできるようです。
設定終了したらrsyslogを再起動。
# services rsyslog restart
送信側rsyslogの設定
httpdが動作している機器のrsyslogを設定。
こちらも/etc/rsyslog.confを編集。設定項目はTCP通信の有効化、ログ出力先の制御。
$ModLoad imuxsock $ModLoad imtcp $InputTCPServerRun 514 *.info;mail.none;authpriv.none;cron.none;local0.none;local1.none -/var/log/messages local0.debug @@rsyslog_server_name local1.debug @@rsyslog_server_name
最後の二行でログの出先を記述。@@でTCP,@だけだとUDP。編集し終わったらrsyslogを再起動。
# services rsyslog restart
ログをrsyslogへ出力するスクリプトを準備
perlスクリプトを準備。こんなのを適当なところへ配置して実効権をつけます。実際に環境では/usr/local/bin/apache_syslog.plに置きました。
#!/usr/bin/perl use Sys::Syslog qw( :DEFAULT setlogsock ); setlogsock('unix'); openlog('apache', 'cons,pid', 'local0'); while ($log = <STDIN>) { syslog('debug', $log); } **Apacheの設定 CustomLogディレクティブで上記のスクリプトへのパイプを記述。こんなです。 >|| ErrorLog syslog:local1 LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined CustomLog |/usr/local/bin/apache_syslog.pl combined
ErrorLogディレクティブはまずはローカルなファイル(log/error_log)などにしておくほうが吉です。この設定でなにかミスをしても全然わかりませんから。