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

时间:2017-10-27 15:17:05

标签: symfony rabbitmq uuid symfony-2.8 monolog

情况:

在我的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"

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

[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命令,因为进程本质上是异步的,并且一些异步进程启动其他异步进程,日志文件是不可读的......)。 怎么办?我在monolog处理程序上找到了很多文档,但它似乎并不是我想要的。我还尝试使用我的uniqueId标头创建一个假请求,推送到stack_request(如经典的http特性),但这看起来很丑陋而且太过虚伪。

理想情况下,我想在我的抽象GenericMyAppConsumer.php中执行此操作:

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

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

我希望我能说清楚。 感谢。

1 个答案:

答案 0 :(得分:1)

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