PHP の error_log に syslog を指定した際に他のログと混ざらないようにする

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 です。