如何使用log4php输出日志文件中的异常信息


How to output exception information in log file with log4php?

我已经设置了log4php,使用LoggerAppenderRollingFile附加器和LoggerLayoutTTCC布局将日志记录到一个文件。然而,当我记录一个异常时,它不会像我在log4net中看到的那样显示异常细节,比如堆栈跟踪。

我快速浏览了一下代码,看起来LoggerAppenderMongoDB支持用formatThrowable方法显示异常,但我在其他appender中没有看到任何类似的东西。

我觉得我错过了一些明显的东西。我是否需要配置一些东西才能将这些详细信息打印到日志文件中?我需要创建一个自定义LoggerAppender类吗?或者这些可以用不同的布局或自定义渲染器来完成?

供参考,现在LoggerLayoutTTCC已弃用,您可以使用带有更好格式字符串的LoggerLayoutPattern来包含例外。

<layout class="LoggerLayoutPattern">
   <param name="conversionPattern" value="%d{m/d/y H:i:s,u} [%t] %p %c %x - %m %newline%throwable" />
</layout>
<!-- %newline%throwable is the important part -->

请参阅文档的日志异常部分:http://logging.apache.org/log4php/docs/layouts/pattern.html#Logging_exceptions

您应该使用PHP set_exception_handler函数并使用该函数包装log4php。查看链接:http://php.net/manual/en/function.set-exception-handler.php

function exception_handler($exception) {

日志->调试美元(美元例外-> getMessage ());}

set_exception_handler (exception_handler);

我得出了同样的结论:看起来log4php只在LoggerAppenderMongoDB.php appender中使用$throwable参数。

LoggerAppenderFile基类依赖于布局LoggerLayoutTTCC来格式化消息(如预期的那样)。该类有一个方法ignoresThrowable(),该方法返回true。虽然这个方法似乎没有被调用,但它确实温和地传达了作者似乎并不打算注意这个错误。

我已经添加了自己的布局类,扩展了LoggerLayoutTTCC并覆盖了format()

    class LoggerLayoutTTCCWithException extends LoggerLayoutTTCC
    {
        public function format(LoggerLoggingEvent $event) {
            $format = parent::format($event);
            $throwableInfo = $event->getThrowableInformation();
            if ($throwableInfo === null) {
                return $format;
            }
            $renderer = new LoggerRendererException();
            return $format . $renderer->render($throwableInfo->getThrowable());
        }
    }

我花了一段时间才弄清楚为什么当抛出异常时,log4php没有记录原始文件名和行号。事实证明,我的自定义exception_handler类只记录异常消息(通过执行$exception->getMessage()),其中不包含文件名和行号。我所要做的就是连接信息:$exception->getFile()$exception->getLine():

public function exception_handler ($exception) {
        $logger = Logger9::create();
        $logger->info($exception->getMessage()." ".$exception->getFile()." ".$exception->getLine());
}

不要忘记注册自定义处理程序:

@set_exception_handler(array($this, 'exception_handler'));