1

Apache log4php を使用し、クラスのヘルパー メソッドによって呼び出されます。

class MyClass{

    function log($msg, $level='info'){
        $log = @Logger::getLogger("MyLogger");
        $log->$level($msg);
    }
}

上記のコードの問題は、ロガーの file:line 列が常にヘルプ メソッドの行番号を報告することです。PHP の debug_backtrace() を使用して、ヘルパー メソッドを呼び出す元の行番号とファイルを取得できます。

$bt = debug_backtrace();
$caller = array_shift($bt);

私の質問は、私のヘルパー メソッド内で file:line 列を設定する方法はありますか? Logger::method か何かを上書きする必要があるのではないかと考えています。

4

2 に答える 2

1

私の解決策は、避けるべきソース コードへのハックです。ほとんどのシナリオをカバーする @Sven による回答がありますが、私にとっては、ログ呼び出しはヘルパー メソッドを経由する必要があります。

LoggerLoggingEvent.php クラス ファイルに、次のメソッドを追加します。

/**
 * Set the event location info
 * @param LoggerLocationInfo $locationInfo
 */
public function setLocationInformation(LoggerLocationInfo $locationInfo) {
    $this->locationInfo = $locationInfo;
}

次に、ログ クラス メソッドで次を使用します。

/**
 * Log an INFO message
 * @param string $msg The message to log
 * @return none
 */
public function log($msg, $level='info'){

    // Manually construct a logging event
    $level = LoggerLevel::toLevel($level);
    $logger = Logger::getLogger(__CLASS__);
    $event = new LoggerLoggingEvent(__CLASS__, $logger, $level, $msg);

    // Override the location info
    $bt = debug_backtrace();
    $caller = array_shift($bt);
    $location = new LoggerLocationInfo($caller);
    $event->setLocationInformation($location);

    // Log it
    $logger->logEvent($event);
}
于 2013-03-08T07:45:42.533 に答える
0

解決策は、独自にログ関数を用意するのではなく、独自のログ関数を呼び出す場所でロガーを使用することです。

class MyClass {
    public function __construct() {
        $this->logger = Logger::getLogger("MyLogger");
    }
    public function anywhere() {
        // $this->log("Foo"); // Don't do this,
        $this->logger->info("Foo"); // do this.
    }
}

一般的なロギング フレームワークは、ログ呼び出しが実際に何層の間接化を行ったかを知ることができず、これらをバックトレースから取り除きます。また、ロガーに例外を渡す機能も失われます。

于 2013-03-06T02:10:19.550 に答える