php Log4HP动态设置文件:行列
使用apache Log4HP及其由我的类中的助手方法调用:php Log4HP动态设置文件:行列,php,log4php,Php,Log4php,使用apache Log4HP及其由我的类中的助手方法调用: class MyClass{ function log($msg, $level='info'){ $log = @Logger::getLogger("MyLogger"); $log->$level($msg); } } 上述代码的问题在于logger中的file:line列将始终报告help方法的line num。我可以使用php的debug_backtrace()获取调
class MyClass{
function log($msg, $level='info'){
$log = @Logger::getLogger("MyLogger");
$log->$level($msg);
}
}
上述代码的问题在于logger中的file:line列将始终报告help方法的line num。我可以使用php的debug_backtrace()获取调用helper方法的原始行num和文件:
所以我的问题是,在我的helper方法中是否有一种方法可以设置file:line列?我在想,我可能需要覆盖Logger::method或其他什么?解决方案不是自己拥有日志函数,而是使用现在调用自己日志函数的Logger
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.
}
}
一般的日志框架无法知道日志调用实际需要多少层间接寻址,并且无法从回溯中剥离这些层。您还失去了将异常传递给记录器的能力。解决方案不是让您自己拥有日志函数,而是使用记录器,您现在可以在那里调用自己的日志函数
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.
}
}
一般的日志框架无法知道日志调用实际需要多少层间接寻址,并且无法从回溯中剥离这些层。您还失去了将异常传递给记录器的能力。我的解决方案是对源代码的黑客攻击,应该避免。@Sven的回答应该涵盖大多数情况,但对我来说,我的日志调用必须通过helper方法 在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);
}
我的解决方案是对源代码进行黑客攻击,这应该避免。@Sven的回答应该涵盖大多数情况,但对我来说,我的日志调用必须通过helper方法 在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);
}
编辑是的,这是一个解决方案,也是大多数情况下的正确答案,谢谢;)我现在参与的项目意味着一些安装可能没有正确设置日志文件等,因此我无法直接访问日志,它必须通过一种方法进行检查,以便不会抛出致命错误。编辑。是的,这是一个解决方案,也是大多数情况下的正确答案,谢谢;)我现在参与的项目意味着一些安装可能没有正确设置日志文件等,因此我无法直接访问日志,它必须通过一种方法进行检查,以避免抛出致命错误。