Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php Log4HP动态设置文件:行列_Php_Log4php - Fatal编程技术网

php 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()获取调

使用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()获取调用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);
}

编辑是的,这是一个解决方案,也是大多数情况下的正确答案,谢谢;)我现在参与的项目意味着一些安装可能没有正确设置日志文件等,因此我无法直接访问日志,它必须通过一种方法进行检查,以便不会抛出致命错误。编辑。是的,这是一个解决方案,也是大多数情况下的正确答案,谢谢;)我现在参与的项目意味着一些安装可能没有正确设置日志文件等,因此我无法直接访问日志,它必须通过一种方法进行检查,以避免抛出致命错误。