【问题标题】:Symfony2 monolog logger custom fields in symfony command execsymfony 命令 exec 中的 Symfony2 独白记录器自定义字段
【发布时间】:2018-04-09 06:08:30
【问题描述】:

情况:

在我的 Symfony2.8 API 中,我有一个用于 Monolog 的自定义 RecordProcessor,我在其中添加了一些方便的信息:

my_api.logger.formatter:
    class: Monolog\Formatter\LineFormatter
    arguments:
        - "[%%datetime%%] [%%extra.request_id%%] [%%extra.ip%%] [%%extra.user%%] %%channel%%.%%level_name%%: %%message%% %%context%%\n"

如您所见,我在每个请求(我猜是常见做法)中添加了一个唯一的执行 Uuid(request_id)到前端控制器(web/app.php)中请求的标头。所以这是我的日志行的样子:

[2017-10-27 13:11:24] [7e1666b7] [79.XX.XX.XX] [myuser@gmail.com] app.INFO: OutGoing GET ...
[2017-10-27 13:11:24] [15ded457] [11.XX.XX.XX] [myotheruser@gmail.com] security.DEBUG: ... 
[2017-10-27 13:11:24] [15ded457] [11.XX.XX.XX] [myotheruser@gmail.com] security.DEBUG: ...
[2017-10-27 13:11:24] [15ded457] [11.XX.XX.XX] [myotheruser@gmail.com] app.INFO: Incoming POST ...
[2017-10-27 13:11:24] [15ded457] [44.XX.XX.XX] [myotheruser@gmail.com] app.INFO: Asynchronous : SENDING message ....

我将 rabbitmq 与 rabbitmq-bundle 和 phpamqplib 一起用于异步繁重的逻辑处理。这适用于通过 symfony 命令(和 rabbitmq-supervisord-bundle)启动的 rabbitmq 消费者。这些 rabbitmq 消费者将内容记录到应用程序的公共日志文件 (/var/log/env.log)。

问题:

我想在消费进程的日志行中添加一个 unique_id(来自 symfony 命令,因为进程本质上是异步的,并且一些异步进程启动其他异步进程,日志文件不可读......)。 怎么做?我在独白处理程序上找到了很多文档,但似乎它不是我想要的。我还尝试使用我的 uniqueId 标头创建一个虚假请求,并将其推送到 stack_request 上(就像在经典的 http trait 中一样),但这看起来很丑陋而且太虚假了。

理想情况下,我想在我的抽象 GenericMyAppConsumer.php 中这样做:

//Constructor of any consumers (sf command)
//...
$this->container->get('logger')->setData('extra.request_id', $this->uniqueId);

因此它将用于所有当前线程的日志记录。

我希望我很清楚。 谢谢。

【问题讨论】:

  • Monolog 有一个 UidProcessor,可以附加到 Symfony 配置中的记录器 - symfony.com/doc/current/logging/processors.html
  • 是的,但它取自会话,我没有在 sf 命令执行上下文中。另外,我希望能够控制该 ID 的生成,并希望在 SF 请求执行计划中尽快设置它。
  • 您可以编写自己的处理器来控制放入其中的内容,但您只需要在写入第一个日志事件之前生成它
  • 我已经有了。这是我从请求堆栈中当前请求的标头中获取 uuid 的地方。 ie: //唯一请求ID if ($request && $request->headers->has('X-MYAPI-REQUEST-ID')) { $record['extra']['request_id'] = $request-> headers->get('X-MYAPI-REQUEST-ID'); }

标签: symfony rabbitmq uuid symfony-2.8 monolog


【解决方案1】:

好的,如果请求标头中没有任何请求 ID,我最终直接在容器感知的 Monolog 处理器中设置当前请求。 那不是很安全,但我看不到其他方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-19
    • 2012-09-11
    • 2018-11-15
    • 2017-02-20
    • 2012-10-07
    • 1970-01-01
    • 2013-10-19
    • 2017-05-02
    相关资源
    最近更新 更多