1270546455 PHPのFATALエラーをapacheのログまたは、指定したファイルへ出力する方法を教えてください!


目的は、PHPプログラムの実行中にクリティカルなエラーが発生したことをswatch経由で取得するためです。

現在のログ周りのphp.iniを以下に記載します。

error_reporting = E_ALL & ~E_NOTICE
display_errors = Off
log_errors = On

回答の条件
  • 1人1回まで
  • 13歳以上
  • 登録:2010/04/06 18:34:17
  • 終了:2010/04/08 10:14:56

回答(2件)

id:GreenStar No.1

GreenStar回答回数192ベストアンサー獲得回数462010/04/06 19:13:21

ポイント65pt

error_reporting = E_ALL & ~E_NOTICE

E_ALL(ただしE_NOTICEは除く)という設定なので致命的エラーはerror_log(access_logとは別ファイル)に出力されてるはずです。

http://php.net/manual/ja/function.error-reporting.php


エラーログの出力先を変えたい場合はphp.iniにて下記の設定を行いますがサーバ全体に影響しますのでレンタルサーバ(占有/VBSで管理者権限を有している場合は除く)であれば無理かもしれません。詳しくはサーバ管理者に相談してくださいね。

error_log = "ディレクトリ/ファイル名"
id:matsubobo

質問がクリアではなくてすいません。クラスIDが見つからなかったときには、E_ERRORレベルのエラーが発生するはずです。そしたら、上記の設定ではapacheのエラーログに出力されると思っていましたが、出力されていません。

2010/04/06 23:45:05
id:Bombastus No.2

ホーエンハイム回答回数409ベストアンサー獲得回数522010/04/06 19:25:28

ポイント5pt

エラーハンドラを置き換えることで対応可能です。

下記のスクリプトをプログラム冒頭に組み込み、"エラーログファイル名" に出力したいファイル名を記述してください。そのファイルにエラーログを追記します。

//新しいエラーハンドラ
function myErrorHandler($errno, $errmsg, $filename, $linenum) {
    $msg = sprintf("PHP error %d: %s in file %s on line %d\n", $errno, $errmsg, $filenam    e, $linenum);
    echo $msg;
    file_put_contents(エラーログファイル名, $meg, FILE_APPEND);
}
//エラーハンドラの置換
$old_error_handler = set_error_handler('myErrorHandler');
id:matsubobo

E_ERRORレベルのエラーが発生したらプログラムの実行は直ちに行われなくなるのでエラーハンドラの置き換えをしても補足できないはずです。

2010/04/06 23:45:59
  • id:GreenStar
    id:Bombastus さん>エラーハンドラを置き換えることで対応可能です。

    はて? FATALエラーを拾えますか?
    http://jp2.php.net/manual/ja/function.set-error-handler.php
    (一部は拾える場合もありますけど、そのためにコード毎に適宜エラーハンドラ書き加えるのですか?)
  • id:GreenStar
    クラスIDという事はCOM関数でも使ってます?
    だとすればE_NOTICEかもしれませんが状況まだ読めてません。
    http://php.net/manual/ja/class.com.php
  • id:matsubobo
    COM関数使っていません。Linux上です。
    普通に自分で定義したクラスがあって、クラスを呼び出すときとか。

    class TestClass{
    }

    new TestClassssss(); // occurs fatal error
  • id:GreenStar
    自前のものからですがerror_logにこんな感じのエラーログが出るはずなんですよね。
    [Wed Apr 07 00:27:43 2010] [error] [client xxx.xxx.xxx.xxx] PHP Fatal error: Class 'TestClassssss' not found in xxxxxxxx
    もう少し起きて、ちょっと、いじってみますが、明日以降になるかもしれないです。
  • id:GreenStar
    あまりにも軽率な思いつきですが、何をやってもerror_logファイルに出力されないのだとすれば、
    バーチャルドメインを使っていて、そちらのほうで指し示しているLogファイルを参照していないだけとか・・・。
  • id:matsubobo
    GreenStar様。夜分遅くまでおつきあいして頂いてありがとうございます。

    その辺りはチェックして居るんですよね。
    やっぱり、php.iniの設定はあっているみたいですよねぇ。

    % tail -f /usr/local/apache/logs/*error_log

    木曜日にテスト環境で、再度トライしてみようと思います。
  • id:matsubobo
    すいません。
    こちらの勘違いでした。アプリケーションフレームワークで出力されているエラーを、PHPのインタプリタが出しているエラーと勘違いしていました。

    GreenStarさんが、00:28:47で発言しているようにログに正常にでますね。
    [Thu Apr 08 10:11:50 2010] [error] [client 192.168.0.50] PHP Fatal error: Class 'TestClassssss' not found in ..................

    お騒がせしました!

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません