组Symfony / Monolog日志消息

时间:2019-03-16 01:26:57

标签: symfony monolog

这是两次请求后我的日志文件的样子:

[2019-03-16 01:20:57] request.INFO: some stuff happened
[2019-03-16 01:20:57] request.INFO: some stuff happened
[2019-03-16 01:21:17] request.INFO: some stuff happened
[2019-03-16 01:21:17] request.INFO: some stuff happened

是否有一种方法可以将每个请求的日志消息分组,以便您可以直观地看到哪些消息属于同一消息?不必花哨。甚至换行符也可以:

[2019-03-16 01:20:57] request.INFO: some stuff happened
[2019-03-16 01:20:57] request.INFO: some stuff happened

[2019-03-16 01:21:17] request.INFO: some stuff happened
[2019-03-16 01:21:17] request.INFO: some stuff happened

我想将其用于类型为fingers_crossed的日志处理程序,该处理程序仅在发生错误时触发,然后记录该请求的所有调试信息。

一些搜索产生的信息很少。不幸的是,Monolog有一个不相关的“组”概念,这使搜索结果变得混乱。

1 个答案:

答案 0 :(得分:1)

如果我的理解正确,您希望在日志文件中有一个可视标记,用于标记请求的日志消息的结尾,对吗?我能想到的最简单的解决方案是在请求周期结束时记录其他消息,例如

$logger->debug('----------------------------------------------------------');
$logger->debug('END OF REQUEST');
$logger->debug('----------------------------------------------------------');

使用Symfony时,我将为kernel.finish_requestkernel.terminate添加一个事件处理程序,以调用记录器。

如果要将其他日志调用保留在引导程序/事件处理代码之外,则可以编写自己的Monolog处理程序类,该类可以包装其他处理程序(有关包装处理程序的示例,请参见BufferHandler) :

  • handle会将消息传递给包装的处理程序。
  • handleBatch可以在传递标记之前将标记附加到批处理的末尾
  • close也可以在调用其关闭函数之前向包装好的hadler发送最后一条日志消息。但是close必须是幂等的,因此在这种情况下可能会造成问题。

如果您的请求长时间运行并且它们的消息混合在日志文件中,请添加BufferHandler以使它们分开。

如果您想删除标记前面的其他日志信息(时间戳,来源,严重性),建议您编写自己的格式化程序(将LineFormatter包装/子类化),根据所显示的日志消息提供不同的输出是否显示“请求结束”消息。在这种情况下,建议您不要发送多条消息作为标记,而是发送一条消息并在格式化程序中定义标记格式。