Apache/バーチャルホストのログをリモートのrsyslogに集約する

提供:maruko2 Note.
移動: 案内, 検索

目次

syslog デーモンと logger コマンドの制限

Apache のアクセスログをログサーバ(syslog)で一括管理する方法としては、CustomLog の出力先を logger コマンドにパイプし syslog へ送る方法があるが、この方法には次のような問題点がある。

rsyslog と Perl スクリプトに入れ替える

これらの問題は syslog と logger コマンドの制限が原因になっているため、代替えのプログラムに変えることで解決する。 syslog は rsyslog に入れ替え、logger コマンドは syslog メッセージを送れる Perl スクリプトに入れ替える。

バーチャルホストが増えた場合でも対応する方法

バーチャルホストごとにログを分けるには、バーチャルホストごとに syslog ファシリティを変えることで対応できる。 しかし、syslog ファシリティの数には限りがあるため、ファシリティでログを分けるには限界がある。(apache のアクセスログ用に使える syslog ファシリティは local0 から local7 までの 8 個。) syslog ファシリティとタグを組み合わせる方法もあるが、バーチャルホストを追加するたびに <VirtualHost>CustomLog 設定と rsyslog の設定を編集しなければならなくなる。

apache remotelog 1.png

rsyslog は、syslog メッセージの内容を元にログを仕分ける property replacer 機能があり、この機能を利用することでバーチャルホストごとにログを分けることができる。

大まかな方法は、バーチャルホスト名を含める LogFormat 形式を作成し、httpd.conf のみに CustomLog の設定をすることでログを1つにまとめて rsyslog に送る。(<VirtualHost> ごとに CustomLog を設定しない。) rsyslog ではバーチャルホスト名をキーに仕分け、バーチャルホストごとのファイルとして書き出す。

apache remotelog 2.png

この方法では、バーチャルホストがいくら増えても CustomLog や rsyslog の設定を変更する必要がない。

さらに、ログを1つにまとめて rsyslog へ送る(パイプする)ので、syslog ファシリティを1つしか使わないうえ、httpd の子プロセスになるログのプロセスも1つですむ。 (<VirtualHost> ごとに CustomLog を設定すると、logger プロセスが設定した行数個 httpd の子プロセスとして起動する。)

設定

httpd.conf

ErrorlogCustomLog 設定を httpd.conf のみにする。

<VirtualHost> ごとに設定しない。全てコメントアウトする。

  1. ErrorLog  syslog:local1
  2. LogLevel  warn
  3. LogFormat "%v %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" vcombined
  4. #CustomLog "|/usr/bin/logger -p local0.debug" vcombined
  5. CustomLog |/usr/local/bin/apache_syslog.pl vcombined

すべてのバーチャルホストのログを1つにまとめることになるが、特定のバーチャルホストだけ別処理をさせることもできる。方法は、別処理をしたい <VirtulHost> 内に CustomLog 設定をすればよい。

例えば、ログを保存しないようにするには次のようにする。

<VirtualHost *:80>
  ...
  CustomLog logs/access.log combined env=0
  ...
</VirtualHost>

Perl スクリプト

ファシリティ local0、プライオリティ debug で syslog メッセージを送る Perl スクリプト。O'Reilly のサイトで紹介されていたスクリプトを一部編集。

  1. #!/usr/bin/perl
  2. use Sys::Syslog qw( :DEFAULT setlogsock );
  3.  
  4. setlogsock('unix');
  5. openlog('apache', 'cons,pid', 'local0');
  6.  
  7. while ($log = <STDIN>) {
  8. 	syslog('debug', $log);
  9. }
  10. closelog

rsyslog.conf (送信側)

Apache が動作しているマシンの rsyslog 設定。

  1. #$ModLoad immark
  2.  
  3. *.info;mail.none;authpriv.none;cron.none;local0.none;local1.none                -/var/log/messages
  4.  
  5. local0.debug	@@192.168.100.166
  6. local1.debug	@@192.168.100.166
  7.  
  8. $WorkDirectory  /var/spool/rsyslog
  9. $ActionQueueFileName uniqName
  10. $ActionQueueMaxDiskSpace 1g
  11. $ActionQueueSaveOnShutdown on
  12. $ActionQueueType LinkedList
  13. $ActionResumeRetryCount -1
  14. $MaxMessageSize 8k

3行目:ファシリティ local0local1 のメッセージが /var/log/messages に記録されないようにする。

5〜6行目:ログサーバ(例では 192.168.100.166)へ TCP 接続でメッセージを送る。

8〜13行目:ログサーバにメッセージを送れない時に、ローカルにスプールする設定。

14行目:rsyslog の最大メッセージサイズを指定する。デフォルトは 2k (2KB) 。

rsyslog.conf (受信側)

Apache のログを受ける、ログサーバの rsyslog.conf 設定。

  1. #$ModLoad immark
  2. $ModLoad imudp.so
  3. $UDPServerRun 514
  4. $ModLoad imtcp.so  
  5. $InputTCPServerRun 514
  6.  
  7. $RepeatedMsgReduction off
  8.  
  9. $template MsgFormat,    "%msg:2:$%\n"
  10. $template httpd_access, "/var/log/rsyslog/%msg:F,32:2%/httpd_access_%$year%%$month%%$day%.log"
  11. $template httpd_error,  "/var/log/rsyslog/%fromhost-ip%/httpd_error_%$year%%$month%%$day%.log"
  12.  
  13. local0.debug            -?httpd_access;MsgFormat
  14. local1.debug            -?httpd_error;MsgFormat

1行目:20分おきに挿入されるマークを記録しないよう immark モジュールをコメントアウト。

2〜5行目:リモートからのメッセージを受信するログサーバ機能を有効にする。あくまでもメッセージの受信を有効にするモジュールであって、TCP 送信を有効にするモジュールではない。TCP 送信はデフォルトの機能。

7行目:同じ内容のメッセージが繰り返し送られてきても last message repeated n times と省略しないようにする。

9〜11行目:メッセージの処理方法をテンプレート化して定義する。書式は Property Replacer に説明がある。

F フィールドを抜き出す
F,32 US-ASCII の 32 番目の文字=スペースを区切り文字にする。
2 2番目のフィールド

13〜14行目:送られてきたメッセージをどのように(保存)するか、テンプレートを組み合わせる。[2]

ファシリティ.プライオリティ     ?保存先;保存フォーマット
ファシリティ.プライオリティ    -?保存先;保存フォーマット

?保存先 の前に - を付けると非同期で保存するようになる。

参考ページ

脚注

  1. <VirtualHost> 内の ServerName ディレクティブで指定しているホスト名になる。
  2. Actions - rsyslog.conf rsyslog
LINEで送る このエントリーをはてなブックマークに追加
個人用ツール
名前空間
変種
表示
操作
案内
ツールボックス

注目のページ

このサイトのはてなブックマーク数