8

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

我快速浏览了代码,看起来LoggerAppenderMongoDB支持使用formatThrowablemethod显示异常,但我在其他 appender 中看不到任何类似的东西。

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

4

4 回答 4

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

于 2013-02-09T11:23:18.090 回答
1

我得出了同样的结论:看起来 log4php 只对appender$throwable中的参数做了一些事情。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());
        }
    }
于 2012-09-12T21:03:43.177 回答
1

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

function exception_handler($exception) {

$log->debug($exception->getMessage()); }

set_exception_handler('exception_handler');

于 2012-08-24T12:17:44.693 回答
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'));
于 2019-09-05T20:57:48.747 回答