symfony command exec 中的 Symfony2 monolog logger 自定义字段

Symfony2 monolog logger custom fields in symfony command exec

情况:

在我的 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) 到前端控制器中请求的 headers (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 header 创建一个假请求,并将其推送到 stack_request(如经典的 http 特征),但这看起来很丑陋而且太假了。

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

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

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

希望我说清楚了。 谢谢

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