LoginSignup
4
5

More than 3 years have passed since last update.

PHPのログをrsyslogでデスクトップに転送する

Last updated at Posted at 2015-02-01

開発マシン側にPHPがあり、PHPを実行するサーバがCentOSなどrsyslogが入っている環境を想定します。
開発時のみです。

1. デスクトップ側でログ受信サーバを立てる

514/UDPで受け取った文字列をそのまま吐き出せばいいので
こんな感じのスクリプトを用意してコンソールなりコマンドプロンプトなりで呼び出すだけです。

receive.php
<?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アドレスを指定したファイルを作ります。

/etc/rsyslog.d/php.conf
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が飛んでくれば上手く動いています。
receiver.png
実際の error_log の設定は php.d/.htaccess.user.iniini_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でもそこそこ動きました。
4
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
5