3 votes

Passer le contexte au Logger asynchrone

J'essaie d'enregistrer les demandes/réponses brutes d'un client http. Je suis les configurations de log4j2 à partir de celles-ci Instructions pour l'enregistrement .

Dépendance du client HttpAsync : - httpasyncclient (version 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>

L'impression est bonne mais le threadcontext n'est pas transmis à l'enregistreur de fils.

Exemple :-

// 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)

Comment puis-je passer le ThreadContext au logger ?

Gracias.

0voto

Remko Popma Points 19015

Étant donné que le thread où l'UUID a été défini (http-bio-8080-exec-1) est différent du thread de votre application qui effectue l'enregistrement (I/O dispatcher 1), ils ont des cartes ThreadContext différentes et le second thread ne peut pas voir ce que le premier thread a mis dans sa carte.

Depuis la version 2.7 de log4j, il est possible de créer un fichier injecteur de données contextuelles personnalisé qui peut obtenir des données contextuelles à partir d'autres endroits que la carte ThreadLocal (car c'est essentiellement ce qu'est le ThreadContext).

Cela signifie que vous devez créer une façade personnalisée, similaire au ThreadContext de log4j, où vous placez des paires clé-valeur dans une structure de données. Je ne suis pas familier avec AsyncHttpClient mais je n'ai pas trouvé de concept de "contexte" permettant à des threads séparés de partager des données associées à la même session.

Votre commande mise en œuvre de l'injecteur de contexte prendrait un instantané des paires clé-valeur et l'injecterait dans le LogEvent pour chaque message du journal.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X