PHP の error_log に syslog を指定した際に他のログと混ざらないようにする
2013-08-30-1: [PHP]
PHP のランタイムのエラーログですが、ファイルを指定するより syslog 経由にしたほうが何かと楽です。
ファイルの場合は、ユーザ権限で実行している cli でのエラーと httpd でのエラーの両方を記録するために、
パーミッションをもしかしたら 777 とかにする必要があるかもしれませんが、
syslog の場合は特にそんなこと気にする必要がありません。
php.ini で下記の設定をするだけなのですが、これだけだとちょっと都合が悪いです。
sudo vim /etc/php.ini
error_log = syslog
というのも送信されるログのファシリティは user なので、例えば CentOS 6 だと /var/log/messages に出力されます。
他のログと混ざるので都合が悪いです。
じゃあ、ということで user.* を全部受けると、例えば yum でのインストールログも出力されるのでこれまた都合が悪いです。
で、本題ですがファシリティが user かつタグ (プログラム名) が httpd (mod_php) または php (cli) の場合だけ専用のログに出力するようにします。
一見めんどくさそうですが、CentOS 6 デフォルトの rsyslog だと、比較的簡単に設定できます。
sudo vim /etc/rsyslog.d/php.conf
$Umask 0000
$RepeatedMsgReduction off
$FileCreateMode 0644
$template php_log,"/var/log/php.log"
if ($syslogfacility-text == 'user') and \
(($programname == 'httpd') or ($programname == 'php')) then \
-?php_log
sudo /etc/init.d/rsyslog restart
で、syslog 経由なので、ログローテートも /etc/logrotate.d/syslog に /var/log/php.log を書いておけば OK です。