状況:Symfony2ののモノローグロガーカスタムフィールド
my_api.logger.formatter:
class: Monolog\Formatter\LineFormatter
arguments:
- "[%%datetime%%] [%%extra.request_id%%] [%%extra.ip%%] [%%extra.user%%] %%channel%%.%%level_name%%: %%message%% %%context%%\n"
:私のSymfony2.8のAPIで
、私はいくつかの便利な情報を追加したモノローグのカスタムRecordProcessorを、持っていますご覧のとおり、フロントコントローラ(web/app.php)のリクエストのヘッダーには、一意の実行Uuid(request_id)をすべてのリクエストに追加します。だからここに私のログラインがどのように見えるかです:
[2017-10-27 13:11:24] [7e1666b7] [79.XX.XX.XX] [[email protected]] app.INFO: OutGoing GET ...
[2017-10-27 13:11:24] [15ded457] [11.XX.XX.XX] [[email protected]] security.DEBUG: ...
[2017-10-27 13:11:24] [15ded457] [11.XX.XX.XX] [[email protected]] security.DEBUG: ...
[2017-10-27 13:11:24] [15ded457] [11.XX.XX.XX] [[email protected]] app.INFO: Incoming POST ...
[2017-10-27 13:11:24] [15ded457] [44.XX.XX.XX] [[email protected]] app.INFO: Asynchronous : SENDING message ....
私は非同期重いロジック処理のためのRabbitMQのバンドルとphpamqplibとRabbitMQのを使用しています。これは、symfonyコマンド(およびrabbitmq-supervisord-bundle)のおかげで起動したrabbitmqのコンシューマで動作します。これらのrabbitmqコンシューマは、アプリの共通ログファイル(/var/log/env.log)にログを記録します。
問題:
私はプロセスが本質的に非同期であるため、symfonyのコマンドから(consummerプロセスのログ行にUNIQUE_IDを追加したい、といくつかの非同期プロセスは、他の非同期プロセスを起動、ログファイルが読めない...)。 どうすればよいですか?私はモノローグハンドラーに関する多くの文書を見つけましたが、それは私が探しているものではないようです。私もstack_request(古典的なhttpの特性として)にプッシュされた私のuniqueIdヘッダーで偽の要求を作成しようとしましたが、これは醜いとあまりにも醜いようです。
理想的には、私は私の抽象GenericMyAppConsumer.phpで、これを実行したいと思います:
//Constructor of any consumers (sf command)
//...
$this->container->get('logger')->setData('extra.request_id', $this->uniqueId);
だから、すべての現在のスレッドのログに使用されます。
私は明らかです。おかげさまで
MonologにはUidProcessorがあります。これはSymfonyのconfig - https://symfony.com/doc/current/logging/processors.html –
のロガーに付けることができますが、セッションから取得したものですsfコマンドexecコンテキストではありません。さらに、私はそのIdの生成を制御できるようにしたいと思っていました。私はそれを可能な限り早くSF要求execプランに設定したいと思っていました。 – bohr
あなた自身のプロセッサを書いて、何が入っているのかを制御することができますが、最初のログイベントが書かれる直前に生成する必要があります。 –