我的生产日志记录使用了以下配置:
monolog:
handlers:
mail:
type: fingers_crossed
action_level: error
handler: grouped
grouped:
type: group
members: [streamed, buffered]
streamed:
type: stream
path: %kernel.logs_dir%/%kernel.environment%.log
level: debug
# buffered is used to accumulate errors and send them as batch to the email address
buffered:
type: buffer
handler: swift
swift:
type: swift_mailer
from_email: info@....com
to_email: info@....com
subject: Error Occurred!
level: debug
这会发送这样的电子邮件:
〔2012-03-21 21:24:09〕安全。调试:从会话[][]
〔2012-03-21 21:24:09〕安全。调试:从用户重新加载用户提供商。[][]
〔2012-03-21 21:24:09〕安全。调试:用户名"jakob.asdf"是从用户提供程序重新加载。[][][2012-03-21 21:24:09]要求信息:匹配的路由"_user_settings"(参数:"_controller":"…Bundle''controller''UserController::settingsAction","用户名":"Jakob.asdf","_route":"_user_settings")[][]
〔2012-03-21 21:24:09〕请求。错误:Symfony''Component''HttpKernel''Exception''NotFoundHttpException:…未找到Bundle''Entity''User对象。(未捕获的异常)/var/www//vendor/bundles/Sensio/Bundle/FrameworkExtraBundle/Request/ParamConverter/DoctrineParamConverter.php第50行[][]
〔2012-03-21 21:24:09〕安全。调试:在会话[][]
我真的很想在这里有一个堆栈跟踪,或者至少是触发错误的控制器中的行号。否则的话,我们真的需要猜测到底出了什么问题。
现在,问题是:有什么方法可以实现这样一个更加详细的日志记录吗?
是的,这是可以实现的。
创建一个ExceptionListener
类。
//namespace declarations
class ExceptionListener{
/**
* @var 'Symfony'Component'HttpKernel'Log'LoggerInterface
*/
private $logger =null;
/**
* @param null|'Symfony'Component'HttpKernel'Log'LoggerInterface $logger
*/
public function __construct(LoggerInterface $logger = null)
{
$this->logger = $logger;
}
/**
* @param 'Symfony'Component'HttpKernel'Event'GetResponseForExceptionEvent $event
*/
public function onKernelException(GetResponseForExceptionEvent $event)
{
if($this->logger === null)
return;
$exception = $event->getException();
$flattenException = FlattenException::create($exception);
$this->logger->err('Stack trace');
foreach ($flattenException->getTrace() as $trace) {
$traceMessage = sprintf(' at %s line %s', $trace['file'], $trace['line']);
$this->logger->err($traceMessage);
}
}
}
然后注册监听器。
kernel.listener.your_listener_name:
class: FQCN'Of'ExceptionListener
tags:
- { name: kernel.event_listener, event: kernel.exception, method: onKernelException , priority: -1}
- { name: monolog.logger, channel: mychannel }
arguments:
- "@logger"
你可以根据自己的要求进行调整。
我喜欢Symfony文档中的解决方案。您所要做的就是将以下代码添加到services.yml
文件中:
services:
my_service:
class: Monolog'Processor'IntrospectionProcessor
tags:
- { name: monolog.processor }
这将使用经过测试的处理器IntrospectionProcessor
向日志中添加更多信息。它可能也会提取出你关心的信息。