開発マシン側にPHPがあり、PHPを実行するサーバがCentOSなどrsyslogが入っている環境を想定します。
開発時のみです。
1. デスクトップ側でログ受信サーバを立てる
514/UDPで受け取った文字列をそのまま吐き出せばいいので
こんな感じのスクリプトを用意してコンソールなりコマンドプロンプトなりで呼び出すだけです。
<?php
$socket = stream_socket_server("udp://0.0.0.0:514", $errno, $errstr, STREAM_SERVER_BIND);
while(1) echo stream_socket_recvfrom($socket, 2048, 0, $peer), "\n";
ログ中の改行コードが「#012」などにエスケープされたりするため細々整形する余地はあります。
2. rsyslogからデスクトップ側のサーバに送る設定
こんな感じで作業しているデスクトップ側のIPアドレスを指定したファイルを作ります。
user.info @192.168.1.100
user.info ~
Docker Desktopでホスト側を指定したい時はIPアドレスでなく @host.docker.internal が使えます。
/var/log/messages にも同じ内容が出てしまわないよう2行目で出さないようにしています。
rsyslog.dディレクトリが無ければ /etc/rsyslog.conf で /var/log/messages に出力してる設定より前に書きます。
そして service rsyslog restart
3. テスト
$ php -derror_log=syslog -r 'syntaxerror'
これでParse errorが飛んでくれば上手く動いています。

実際の error_log の設定は php.d/、.htaccess、.user.ini、ini_set() など都合の良い場所で行います。
使い所
- エラーログだけでも使えますがprintデバッグ的に
error_log(var_export($var,1))なども便利です。
(例えばjsonなどを返しておりvar_dump()できない状況など) -
error_log()を介しているため大抵のフレームワークや既存コードに干渉されず使えると思います。 - サーバにログインしてシェルで
tail -f /var/log/php/error.logでも大体一緒ですが、一旦ログに書きだされたりログインするのが気に食わない場合に。 - ログ送信側サーバは複数あっても大丈夫なはずです。
- PHPに限らずLog4JのUDPAppenderの受信用にも使えるかも知れません。
- rの付かないsyslogでもそこそこ動きました。