情况:
在我的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);
因此它将用于所有当前的线程记录。
我希望我能说清楚。 感谢。
答案 0 :(得分:1)
好的,如果请求标头中没有任何请求ID,我最终会直接在Monolog处理器中设置当前请求,该处理器可识别容器。 那不是很安全,但我看不到其他方法。