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

时间:2011-08-18 12:29:07

标签: php exception logging log4php

我已设置log4php以使用LoggerAppenderRollingFile appender和LoggerLayoutTTCC布局登录文件。但是,当我记录异常时,它不会显示异常详细信息,例如我习惯在log4net中看到的堆栈跟踪。

我已经快速查看了代码,看起来LoggerAppenderMongoDB支持使用formatThrowable method显示异常,但我在其他appender中看不到任何类似内容。

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

4 个答案:

答案 0 :(得分:2)

仅供参考,现在不推荐使用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

答案 1 :(得分:1)

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

function exception_handler($exception) {

$对数&GT;调试($ exception-&GT;的getMessage()); }

set_exception_handler( 'exception_handler');

答案 2 :(得分:1)

我得出了相同的结论:看起来log4php只对$throwable appender中的LoggerAppenderMongoDB.php参数执行了操作。

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());
        }
    }

答案 3 :(得分:0)

花了我一段时间才能弄清楚为什么在抛出异常时 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'));