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)などにしておくほうが吉です。この設定でなにかミスをしても全然わかりませんから。