2016-11-14 2 views
3

httpクライアントから生のリクエスト/応答をログに記録しようとしています。 これらのうちlog4j2の設定に従っていますlogging instructionsasync loggerにコンテキストを渡す

HttpAsyncクライアント依存: - httpasyncclient(バージョン4.1.1)

log4j2.xml

<?xml version="1.0" encoding="UTF-8"?> 
<Configuration status="WARN"> 
<Appenders> 
    <RollingRandomAccessFile name="app-log" fileName="${log.path}/app.log" 
          filePattern="${log.path}/app-%d{yyyy-MM-dd}.gz"> 
     <PatternLayout> 
      <pattern>[%-5level] [%X{uuid}] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n</pattern> 
     </PatternLayout> 
     <Policies> 
      <TimeBasedTriggeringPolicy interval="1" modulate="true"/> 
     </Policies> 
    </RollingRandomAccessFile> 
</Appenders> 
<Loggers> 
    <AsyncLogger name="org.apache.http.impl.conn.Wire" level="debug"> 
     <AppenderRef ref="app-log"/> 
    </AsyncLogger> 
    <AsyncRoot level="debug" includeLocation="true"> 
     <AppenderRef ref="app-log"/> 
    </AsyncRoot> 
</Loggers> 
</Configuration> 

これは細かい印刷されているが、ワイヤはThreadContextロガー上に通過されていません。

例: -

// with uuid, output of logger.debug(ThreadContext.getImmutableContext().toString()); 

[DEBUG] [c48b97f7-0094-44af-82af-3d6b43d76014] 2016-11-14 17:06:03.408 [http-bio-8080-exec-1] OutboundRequestHandler - {uuid=c48b97f7-0094-44af-82af-3d6b43d76014} 

// without uuid 
[DEBUG] [] 2016-11-14 17:06:03.440 [I/O dispatcher 1] headers - http-outgoing-0 >> POST /abcd.json HTTP/1.1 
[DEBUG] [] 2016-11-14 17:06:03.441 [I/O dispatcher 1] headers - http-outgoing-0 >> Content-Length: 2 
[DEBUG] [] 2016-11-14 17:06:03.441 [I/O dispatcher 1] headers - http-outgoing-0 >> Content-Type: text/plain; charset=ISO-8859-1 
[DEBUG] [] 2016-11-14 17:06:03.441 [I/O dispatcher 1] headers - http-outgoing-0 >> Host: 127.0.0.1:80 
[DEBUG] [] 2016-11-14 17:06:03.441 [I/O dispatcher 1] headers - http-outgoing-0 >> Connection: Keep-Alive 
[DEBUG] [] 2016-11-14 17:06:03.441 [I/O dispatcher 1] headers - http-outgoing-0 >> User-Agent: Apache-HttpAsyncClient/4.1.1 (Java/1.8.0_92) 

は、どのように私はロガーにはThreadContextを渡すことができますか?

ありがとうございました。

答えて

0

UUIDが設定されたスレッド(http-bio-8080-exec-1)は、ロギングを実行しているアプリケーションのスレッド(I/Oディスパッチャ1)とは異なるため、ThreadContextマップと2番目のスレッドは、1番目のスレッドがマップに入れたものを見ることができません。

log4j 2.7以降、コンテキストデータをThreadLocalマップからではなく他の場所から取得できるcustom context data injectorを作成することができます(これは基本的にThreadContextのためです)。

これは、log4jのThreadContextと同様に、いくつかのデータ構造にキーと値のペアを配置するカスタムファサードを作成する必要があることを意味します。私はAsyncHttpClientに慣れていませんが、別のスレッドが同じセッションに関連するデータを共有できるようにする「コンテキスト」概念を見つけることができませんでした。

あなたのカスタムcontext injector implementationは、キーと値のペアのスナップショットを取り、それを各ログメッセージのLogEventに挿入します。

+0

どのようにキーまたは値の範囲を定義しますか。たとえば、着信要求傍受時のhttp-bio-8080-exec-1スレッドは、uuidを作成してMDCに追加し、応答を書き込む前にフィルタでクリアします。このスレッド(同期モデル)によってサブミットされたタスクを実行しているすべてのスレッドは、loggerにuuidを記録する必要があります。カスタムデータインジェクタはここでどのように役立ちますか(上記のシナリオではより一般的な使用例)、他のシナリオタスクでは使用できません。 – Shashank

関連する問題