2017-10-27 6 views
0

状況: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); 

だから、すべての現在のスレッドのログに使用されます。

私は明らかです。おかげさまで

+0

MonologにはUidProcessorがあります。これはSymfonyのconfig - https://symfony.com/doc/current/logging/processors.html –

+0

のロガーに付けることができますが、セッションから取得したものですsfコマンドexecコンテキストではありません。さらに、私はそのIdの生成を制御できるようにしたいと思っていました。私はそれを可能な限り早くSF要求execプランに設定したいと思っていました。 – bohr

+0

あなた自身のプロセッサを書いて、何が入っているのかを制御することができますが、最初のログイベントが書かれる直前に生成する必要があります。 –

答えて

1

OK、要求ヘッダーにリクエストIDがない場合は、コンテナ対応のMonolog Processorに直接現在のリクエストを設定しました。 それは本当に安全ではありませんが、私は他の方法を見ることができません。