開発マシン側に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でもそこそこ動きました。