【发布时间】: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