タグ別アーカイブ: syslog

PHPのエラーログをsyslog経由で出力する

1. PHPのエラーログ

PHPではエラーログを出力することが出来る。PHPのエラーログは、php.iniで定義される出力方法、出力条件に従って、error_logの項目で定義された方法によって出力される。例えばapacheでmod_phpを経由してphpを利用した場合にブラウザにエラー情報を出力するか否か、などなど。

そして出力方法のところには、ファイル若しくはsyslogを指定出来たりもする。この項目はerrro_logで示される。

shell> grep error_log /usr/local/etc/php.ini
; Log errors into a log file (server-specific log, stderr, or error_log (below))
; Set maximum length of log_errors. In error_log information about the source is
;error_log = filename
error_log = syslog
;error_log = /var/log/php_error.log

ここにerror_log=syslogと書けばローカルホストのsyslogdへログを送る。なので後はローカルホストのsyslogを設定すればおk。

なお、送られるログのファシリティはuser、apache+mod_phpで利用したときにはタグ(プログラム名)はhttpd。

プログラム名はphpで送られるのかと思ったのだけれど、httpdで送られているので間違えやすく注意が必要。

2. ファイルとsyslogの両方に出力したい

さて、コレでひとまずsyslogへログを出力出来るようにはなったんだけど、現状syslogサーバへログを転送しているのでこれだとローカルのログファイルへは書き込まれない。

コレを書き込めるようにするため、error_logを二行に渡って書いてみたりしたけどダメだった。なのでsyslog側で対処してやる。

なお、プログラム名のhttpdとそれを受け取るファイルの場所は連続して書き込まないとダメだったりする。書き出すファイルの所有者はsyslogdのユーザ。

shell> egrep '@|http|php' /etc/syslog.conf
*.*                                             @loghost
!httpd
*.*                                             /var/log/php.log
shell> touch /var/log/php.log

shell> /etc/rc.d/syslogd restart

なおコレで出力される形式はphp.iniで設定されるものとはちょっと違うのでちょっと残念。

続きを読む PHPのエラーログをsyslog経由で出力する

loggerコマンドの使用例

syslogフォーマットでログを送信することのできるloggerコマンドの使用例。

loggerコマンドの使用例

shell> logger -h host.l2tp.org -p local0.info -t hoge
hogehoge ^D

-hでホストを指定

-pはプライオリティを指定。 ドット区切りでログファシリティとログレベルを指定

-tはタグ指定。プログラム名とも呼ばれる。

FreeBSDのsyslogがうまく動いていない

FreeBSDのsyslogがうまく動いていない。

現在syslogの集約サーバを立てているがそこへログが届かなくなっていた。

最初はサーバ側のエラーを疑っていたりしたが(実際サーバ側にも問題があった)、それでも複数のホストからログが届かない。

ログが届かないホストで調べてみた。


%/etc/rc.d/syslogd status
syslogd is not running.

なるほど、止まってる。


%sudo /etc/rc.d/syslogd start
Starting syslogd.
syslogd: child pid 390 exited with return code 1
/etc/rc.d/syslogd: WARNING: failed to start syslogd

起動させようとしても起動しない。

PIDファイルを調べると


%ls -lat /var/run/syslog*
-rw-r--r--  1 root  wheel  0 Feb 25 15:50 /var/run/syslogd.sockets

socketファイルは存在する。


%sockstat | grep syslog
root     syslogd    719   4  dgram  /var/run/log
root     syslogd    719   5  dgram  /var/run/logpriv
root     syslogd    719   6  udp6   *:514                 *:*
root     syslogd    719   7  udp4   *:514                 *:*

socketは利用されているらしい。


%ps auxww | grep 719
root     719  0.0  0.0  7024  1652  ??  Ss   25Feb11   0:14.45 /usr/sbin/syslogd -s
yousan   432  0.0  0.0  9092  1744   0  S+    9:19AM   0:00.00 grep 719

syslogdが走ってる。

/var/run/syslogd.pidファイルが存在しないけどsyslogdが走ってる状況に。なぜだろう。

手動でkillしてやる。


# sudo killall  syslogd
% ps auxww | grep syslogd
yousan   525  0.0  0.0  9092  1744   0  S+    9:21AM   0:00.00 grep syslogd

ちゃんと終了した。

で、再起動


%sudo /etc/rc.d/syslogd start
Starting syslogd.

どうやらうまくいったみたい。

syslog周りで変な問題が

syslog周りで変な問題が。

各ホストでとったsyslogがsyslogサーバに転送されない、されてなかった。

思い当たるふしはたくさんあってアレなんだけど、そのままの状態でloggerコマンドを手打ちしてもダメ。

各ホストでsyslogdaemonを再起動したらうまくいった。どうやらsyslog daemonでサーバへのコネクションをもっている、のかな。そんでそのコネクションがロストすると以後うまく接続できない、とか。

発生した問題がdhcpとかdnsまわりだったので名前解決ができなくなってそのまま内部でアボーンとか。

ちょっとよくわかんないけどそんなメモ。