组Symfony / Monolog日志消息

问题描述 投票:1回答:1

这是我的日志文件在2个请求后的样子:

[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有一个不相关的“群体”概念,这使搜索结果变得混乱。

symfony monolog
1个回答
1
投票

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

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

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

如果你想从引导/事件处理代码中保留额外的日志调用,你可以编写自己的Monolog处理程序类来包装其他处理程序(有关包装处理程序的示例,请参阅BufferHandler):

  • handle会将消息传递给包装的处理程序。
  • handleBatch可以在传递之前将您的标记附加到批次的末尾
  • 在调用close函数之前,close还可以向包装的hadler发送最后一条日志消息。但是close需要是幂等的,所以这可能会对这种情况造成问题。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.