PHPのエラーログをsyslog経由で出力する

1. PHPのエラーログ

PHPではエラーログを出力することが出来る。PHPのエラーログは、php.iniで定義される出力方法、出力条件に従って、error_logの項目で定義された方法によって出力される。例えばapacheでmod_phpを経由してphpを利用した場合にブラウザにエラー情報を出力するか否か、などなど。

そして出力方法のところには、ファイル若しくはsyslogを指定出来たりもする。この項目はerrro_logで示される。

shell> grep error_log /usr/local/etc/php.ini
; Log errors into a log file (server-specific log, stderr, or error_log (below))
; Set maximum length of log_errors. In error_log information about the source is
;error_log = filename
error_log = syslog
;error_log = /var/log/php_error.log

ここにerror_log=syslogと書けばローカルホストのsyslogdへログを送る。なので後はローカルホストのsyslogを設定すればおk。

なお、送られるログのファシリティはuser、apache+mod_phpで利用したときにはタグ(プログラム名)はhttpd。

プログラム名はphpで送られるのかと思ったのだけれど、httpdで送られているので間違えやすく注意が必要。

2. ファイルとsyslogの両方に出力したい

さて、コレでひとまずsyslogへログを出力出来るようにはなったんだけど、現状syslogサーバへログを転送しているのでこれだとローカルのログファイルへは書き込まれない。

コレを書き込めるようにするため、error_logを二行に渡って書いてみたりしたけどダメだった。なのでsyslog側で対処してやる。

なお、プログラム名のhttpdとそれを受け取るファイルの場所は連続して書き込まないとダメだったりする。書き出すファイルの所有者はsyslogdのユーザ。

shell> egrep '@|http|php' /etc/syslog.conf
*.*                                             @loghost
!httpd
*.*                                             /var/log/php.log
shell> touch /var/log/php.log

shell> /etc/rc.d/syslogd restart

なおコレで出力される形式はphp.iniで設定されるものとはちょっと違うのでちょっと残念。

2. syslog-ngでの衝突

そんでもって、ログの転送先ではhttpd-hogehogeってプログラム名ですでにロギングしてたのでログが混同して大変だったり。

なのでちょっとsyslog-ngも調整してみた。

shell> egrep "php" syslog-ng.conf
destination php { file("/usr/syslog/$HOST/php-s.log"); };
filter f_php { program("^httpd$"); }; # mod_php sends log with "httpd" tag name
log { source(src); filter(f_php); destination(php); };

元々ログを取ってたのはhttpd-hogehogeっていう名前だったんだけど、それを program(“httpd”) と言う名前のフィルタで拾ってしまってた。program(“httpd”)って、てっきり完全一致だと思ったんだけど、どうやら部分一致らしい。正規表現が使えるから当然といえば当然なんだけど。

これでphpのログのみが流れるようになった。

コメントを残す