1

使用 apache log4php 并在我的类中由辅助方法调用它:

class MyClass{

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

上面代码的问题是 logger 中的 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 回答