我已设置log4php以使用LoggerAppenderRollingFile appender和LoggerLayoutTTCC布局登录文件。但是,当我记录异常时,它不会显示异常详细信息,例如我习惯在log4net中看到的堆栈跟踪。
我已经快速查看了代码,看起来LoggerAppenderMongoDB支持使用formatThrowable
method显示异常,但我在其他appender中看不到任何类似内容。
我觉得我错过了一些明显的东西。为了将这些细节打印到日志文件,我需要配置一些东西吗?我是否需要创建自定义LoggerAppender类?或者可以使用不同的布局或自定义渲染器来完成这些操作吗?
答案 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'));