2016-11-14 4 views
3

Я пытаюсь зарегистрировать необработанный запрос/ответ от http-клиента. Я следую конфигурациям log4j2 из этих logging instructions.Пропустить контекст для async Logger

HttpAsync Client Dependency: - 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), отличается от потока в приложении, который выполняет регистрацию (диспетчер ввода-вывода 1), у них разные карты ThreadContext и 2-я нить не может видеть, что 1-я нить положила на ее карту.

Поскольку log4j 2.7 можно создать custom context data injector, который может получать данные контекста из других мест, чем из карты ThreadLocal (поскольку это по существу то, что является ThreadContext).

Это означает, что вам нужно создать собственный фасад, похожий на ThreadContext log4j, где вы кладете пары ключ-значение в некоторую структуру данных. Я не знаком с AsyncHttpClient, но я не смог найти концепцию «контекста», которая позволяет отдельным потокам обмениваться данными, связанными с одним и тем же сеансом.

Ваш пользовательский context injector implementation сделает снимок пар ключ-значение и введет его в LogEvent для каждого сообщения журнала.

+0

Как определить объем ключа или значение. Например, поток http-bio-8080-exec-1 при перехвате входящего запроса создаст uuid и добавит в MDC, также очистит фильтр до написания ответа. Теперь вся нить, выполняющая задачу, представленная этим потоком (модель aync), должна регистрировать uuid в журнале. Как здесь может помочь пользовательский инжектор данных (более общий вариант использования для вышеуказанного сценария) не для какой-либо другой задачи сценария. – Shashank

Смежные вопросы