-2

ログに多くの PHP 通知を受け取りましたが、どのページの URL がどこで発生したか知りたいです 通知、この情報をログに記録するにはどうすればよいですか?

[29-Nov-2012 13:58:29] PHP Notice:  Array to string conversion in /usr/home/sdf/data/www/sdfsdf.com/core/test.php on line 156

情報をログに記録したいのですが、NOTICE を受け取った場合、どのようにログに記録しますか?

4

4 に答える 4

0

あなたができることは、その通知の原因となった URL を見つけるために、php の通知時間を Web サーバーのアクセス ログと比較することです。

通知は、実際には URL 依存のようには見えません。これは、「型」配列を文字列にキャストしようとしていることを示しています。これは、次のようなことをすると発生します。

$array = array( 'foo', 'bar' );

echo $array;
$string = 'test' . $array;
printf ( 'foo %s', $array );
于 2012-11-29T13:24:47.983 に答える
0

PHP エラー ログのタイムスタンプと Web サーバーのアクセス ログを関連付けてみてください。

または、ログを tail -f し、ランダム ページをトリガーすることもできます。

または、カスタム エラー ハンドラーを設定して、あらゆる種類のデータをログに記録します。

http://php.net/manual/en/function.set-error-handler.php

function myErrorHandler( $errno, $errstr, $errfile, $errline ){

    if (!(error_reporting() & $errno)) {
        // This error code is not included in error_reporting
        return;
    }

    switch ($errno) {
    case E_USER_ERROR:
        echo "<b>My ERROR</b> [$errno] $errstr<br />\n";
        echo "  Fatal error on line $errline in file $errfile";
        echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n";
        echo "Aborting...<br />\n";
        exit(1);
        break;

    case E_USER_WARNING:
        echo "<b>My WARNING</b> [$errno] $errstr<br />\n";
        break;

    case E_USER_NOTICE:
        echo "<b>My NOTICE</b> [$errno] $errstr<br />\n";
        break;

    default:
        echo "Unknown error type: [$errno] $errstr<br />\n";
        break;
    }

    /* Don't execute PHP internal error handler */
    return true;

}

set_error_handler( "myErrorHandler" );
于 2012-11-29T13:19:48.820 に答える
0

エラー/デバッグ情報が発生したときにキャプチャするように何かを設定する必要がありますが、それを全世界に表示する必要はありません。このアプリケーションにセッション管理が組み込まれているかどうかはわかりませんが、この演習用にいくつかの基本的なコントロールを追加することをお勧めします。

複数のページに含まれる関数を使用すると、エラーを追跡するのが難しくなることがあります。エラーは親ページで発生しているように見えますが、実際には別のページに含まれる関数でトリガーされます。この場合、エラー行番号は誤解を招く可能性があります。

すぐに特定できない断続的なエラーがある場合は、スクリプトで何が起こっているかについてフィードバックを得ることが役立つ場合があります。関数で基本的なデバッグを行う方法の大まかな例を次に示します。

function get_func_argNames($funcName) 
{
    $f = new ReflectionFunction($funcName);
    $result = array();
    foreach ($f->getParameters() as $param) 
    {
        $result[] = $param->name;
    }
    return $result;
}


function myCoolFunction($arg1, $arg2, $arg3)
{

    $debug = false;

    $php_function_args  = implode(', ',get_func_argNames(__FUNCTION__));

    $_debug_txt = "<b><span style='color:blue;'>function</span> <span style='color:darkblue;'>" .__FUNCTION__. "</span></b>($php_function_args)";

    if ($debug)
    {
        EmailAppDev($_debug_txt);
    }

        // myCoolFunction
        $x = $arg1 + $arg2 + $arg3;
        return $x

 }

誰に対して $debug を有効にするかを制御できるセッション アカウントを持っているのが理想的です。

関数を使用していない場合は、スクリプトの戦略的な領域に同様のものを設定して、いつどこで問題が発生するかを調べる必要があります。

アプリ全体を確認しないと、詳細を示すのはかなり困難です。

于 2012-11-29T13:17:32.097 に答える
0

特にこのエラーを見つけるには、これを実行して何が問題なのかを突き止めることができます (を使用してバックトレースを出力することを含むdebug_backtrace):

if (is_string($var)) {
    //Then it's OK - do whatever you were doing on line 156
} else {
    //Something's wrong! Let's log it to some file!
    ob_start();
    var_dump($var);
    print_r(debug_backtrace());
    echo "\n----------------------------------------------\n";
    $debugContent = ob_get_clean();

    $logHandle = fopen("wrong_var_type.log", "a");
    if ($logHandle !== false) {
        fwrite($logHandle, $debugContent . "\n");
    }
    @fclose($logHandle);
}

または、ロガーを使用します。

https://stackoverflow.com/a/10800296/247893

于 2012-11-29T13:25:57.500 に答える