我已经设置了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'));