-1

まあ、それが私が望んでいるものかどうかはわかりません。しかし、ここに私の問題があります:

エラーが発生した場合に備えて、FILE、CLASS、FUNCTION、および LINE をファイルに記録しています。そのために私は次のようなことをしています:

myLog('['. __FILE__ . ']' . '[' . __CLASS__ . ']' . '[' . __FUNCTION__ . ']' . '[' . __LINE__ . ']');

問題は、パラメーターでそのコードを繰り返さなければならないところです。フォーマットを変更したい場合は、どこでも変更する必要があります。

どうすれば次のようなものを手に入れることができますか:

myLog(LOG_MSG_FORMAT);

PHP定義では、定義が使用されている場所ではなく、その定義がある場所のLINE番号が得られるため、不可能です。

これに対する解決策は大歓迎です。#def の C のような機能を持つことについて、私は意地悪ではありません。

編集: この関数は、エラーが発生した場合にのみ呼び出されるとは限りません。その関数を呼び出している場所ならどこでも、ファイル、行などをログに記録したいだけです。したがって、コードを「」のどこかに貼り付けるだけで、行などをログに記録する必要があります。

例えば:

<?php
...
...
<log this location>
...
...
<log this location>
4

3 に答える 3

2

debug_backtrace()

于 2010-06-10T07:28:47.447 に答える
1

PHP には C のようなプリプロセッサはありません。ただし、独自のエラー ハンドラを使用し、その中で既にdebug_backtrace説明したものを使用して、必要な情報を取得できます。

于 2010-06-10T08:12:07.797 に答える
0

他の人が言ったように、debug_backtraceを使用して、ログ関数の呼び出し場所を見つけることができます。debug_backtraceは非常に一貫性がないため、いくつかのトリックが含まれています。例を次に示します。

// helper
function e($a, $k, $d = null) { 
    return isset($a[$k]) ? $a[$k] : $d; 
}

function mylog($msg) {
    $t0 = e(debug_backtrace(), 0);
    $t1 = e(debug_backtrace(), 1);

    $header = sprintf("%s:%s (%s:%s)",
        e($t1, 'class', 'global'),
        e($t1, 'function', 'unknown'),
        e($t0, 'file'),
        e($t0, 'line'));

    $_ = func_get_args();
    $s = $header . ': ' . vsprintf(array_shift($_), $_);

    echo $s, "\n"; // or error_log
}

無料のボーナスとして、my_logはprintfスタイルのパラメータリストも受け入れます。

 my_log("send mail to=%s subject=%s time=%d", $to, $subject, time());
于 2010-06-10T09:35:13.900 に答える