ラベル log の投稿を表示しています。 すべての投稿を表示
ラベル log の投稿を表示しています。 すべての投稿を表示

2011年1月25日火曜日

Apacheで特定のアクセスをログから除外したり、月ごとにログファイルを分けたりする

(2011/1/26変更:ログのローテーションはLinuxだったらlogratateに任せればいいかなと思ってWindows限定の書き方をしたけど、Windowsじゃなくてもrotatelogsを使いたい場面はあると思い変更した。)

Apacheのログ出力設定のメモ。

こんなことをしたい場合の例。

  • SetEnvIfとenv=!を使って、任意のアクセスをログ出力対象外にする
  • ログ内容のフォーマットはcombinedで (もっと詳しくログりたい場合は自分でフォーマットを作る)
  • (Windowsの場合、)Apacheに標準で付いてくるrotatelogsを使って任意の時間でログファイルを分割する

#ログに残さないアクセス元
SetEnvIf Remote_Addr 127.0.0.1      nolog
#前方一致でも可
SetEnvIf Remote_Addr 192.168.       nolog

#月ごとにローテーションする場合は%Y%m
CustomLog "|bin/rotatelogs -l logs/access_%Y%m.log 86400" combined env=!nolog

と、思ったら3年前に自分で既にメモしていた... → floatingdays: ApacheでURIに応じてアクセスログを分ける方法

2009年11月6日金曜日

PHPで Fatal Error時の状況を調べる方法

PHPでFatal Errorが発生すると以降の処理が実行されない。
かつ、try/catchやset_error_handler()ではFatal Errorを捕まえられない。
なので通常は、Fatal Errorが起きたときの詳しい状況はログに残らない。
(例えばエラーが起きたPHPのファイル名はログに残るが、それを呼び出した側のPHP名や、データの状況は分からない。)

しかし、register_shutdown_function()を使えばエラーが起きたときの状況をログに残せる。

register_shutdown_function('shutdownHandler');

function shutdownHandler(){
$error = error_get_last();
if ($error['type']) { //エラーの場合のみ
error_log(...); //必要な情報を書き出す。
}
}

ただしこれだとE_NOTICEとかでもひっかかってしまうので、Fatal Errorだけを拾いたい場合はtypeを指定する。
register_shutdown_function('shutdownHandler');

function shutdownHandler(){
$error = error_get_last();
if ($error['type'] == E_ERROR) {
error_log(...); //必要な情報を書き出す。
}
}
これだとExceptionが拾えない?


参考:
PHP の「エラー処理ハンドラ」「シャットダウンハンドラ」「例外処理ハンドラ」の挙動 - Web/DB プログラミング徹底解説
PHP: register_shutdown_function - Manual

2009年1月26日月曜日

.htaccessでPHPのエラーログ設定をする方法

例えばこんな感じで。
flagとvalueを使い分ける。

php_flag display_errors On
php_flag log_errors On
php_value error_log /var/www/log/php_error.log

参考:PHPのエラーログについて PEAR::Logでエラーログを取りたいです(中略)人力検索はてな

ブログ アーカイブ

tags