6

最近、レガシーシステムの開発を引き継ぎE_NOTICE、デプロイメント環境でPHPのロギングをオンにできるようにしたいと考えています。デプロイメント環境iniには、次のディレクティブがあります。

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

error_reportingを使用してビットマスクを比較しましたがecho (E_ALL & ~E_DEPRECATED).' = '.error_reporting();、両方が一致しているためerror_reporting、システム自体のレベルは変更されておらず、回転するとdisplay_errors = On通知が表示されますが、ログには記録されません。

では、どうすればPHPのロギングを開始できE_NOTICEますか?

4

3 に答える 3

3

アップデート:

この回答のコメントの@mpcによると、オンの場合、エラーはブラウザに表示されますがdisplay_errors、ログには表示されません。エラーがまったく出てこないと思っていました。

ログに表示されないのはエラーだけですかE_NOTICE、それともすべてのエラータイプが影響を受けますか?すべてのエラータイプの場合、最初に確認するのは、エラーログが有効になっているかどうかです。ini_set('log_errors', 'On');スクリプトの上部で設定してみてください。それでも問題が解決しない場合は、を呼び出してサーバーが確実ini_set('error_log', 'your_file_path');に書き込むことができるものにログファイルを設定してみてください。これらのどちらも機能しない場合は、PHPのインストールに深刻な問題があると思います。これらの修正のいずれかがphp.ini機能する場合、アクセスできる場合はそれらを実際に配置できます。


元の回答:

質問のレベルに基づいて、エラーerror_reportingを報告するようにPHPインストールがすでに設定されている必要があります。E_NOTICEこれらのエラーをログに記録していない場合は、何かが間違っています。エラーが表示されるdisplay_errorsかどうかを確認するためにオンにすることをお勧めします。ファイルをE_NOTICE変更できない場合は、スクリプトの先頭で実行してみてください。明らかに、これらのエラーは、トリガーした場合にのみ表示および/またはログに記録されるため、実際にどこかでそれを行っていることを再確認する必要があります。php.iniini_set('display_errors', 'On');

注意点の1つは、E_DEPRECATEDエラーレベルがPHP5.3でのみ導入されたことです。E_DEPRECATEDPHP 5.2インストールで設定をテストしたところ、PHPはエラーで応答し、error_reportingレベルをに設定しました。これは、エラーがまったく0報告されないことを意味します。5.3より前のファイルでこの設定を使用することは意味がありませんが、少なくともそれをサポートしていないサーバーで使用している可能性を高めることが重要だと思います。バージョンがわからない場合は、実行すると、インストールのバージョン番号など、多くの情報が記載されたページが表示されます。php.iniE_DEPRECATEDphpinfo()

上記にもかかわらず、私があなたの質問を誤解し、独自のカスタムロギングを作成することだけを話している場合は、エラーが発生したときに実行する関数を作成し、その関数を使用してエラーハンドラーとして割り当てる必要がありset_error_handler()ます。

set_error_handler()を使用する場合、PHPのデフォルトのエラーハンドラを完全にバイパスすることに注意することが重要です。これはあなたのerror_handlerレベルが無意味になることを意味します。重大度に関係なく、すべてのエラーは、作成したエラーハンドラー関数に渡されます。E_xxxPHPによってこの関数に渡される最初のパラメーターは、検出されたエラーの定数の数値であるエラー番号になります。必要なエラーのみをキャッチするカスタムコードを作成する必要があります。

たとえば、エラーのみ E_NOTICEをキャッチするには、関数は次のようになります。

function my_error_handler($errno, $errstr, $errfile, $errline) {
  if ($errno == E_NOTICE) {
    // handle/log the error
  } 
}

set_error_handler("my_error_handler");
于 2011-08-22T16:11:28.747 に答える
2

システムにはカスタムApacheErrorLogディレクティブが定義されており、私がtail -f ...デフォルトのApacheerror_logであることがわかりました。

自己への注意:SOにばかげた質問を投稿する前に、必ず最初にWebサーバーのセットアップを確認してください。

于 2011-08-23T09:35:40.007 に答える
0

独自のハンドラーを作成できます

<?php


function myErrorHandler($errno, $errstr, $errfile, $errline)
{
    if ($errno == E_USER_NOTICE){
        /*  log actions here */
    }
}

set_error_handler("myErrorHandler");
于 2011-08-22T15:47:40.233 に答える