2015-10-23 31 views
11

Sto sviluppando un'applicazione RCP di Eclipse e mi sono dato da fare per far funzionare log4j2 all'interno dell'app. Tutto sembra funzionare bene ora, e come tocco finale volevo fare all loggers asynchronously.Come verificare log4j2 sta registrando in modo asincrono via LMAX disturbatore?

Sono riuscito a ottenere LMAX Disruptor sul classpath, e penso di aver risolto il issue di fornire sun.misc pure. Impostare correttamente l'argomento VM -DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector nella configurazione di esecuzione e impostare correttamente il file log4j2.xml. Penso che. Ed è qui che il problema è. Mi piacerebbe essere in grado di verificare che la mia applicazione registri in modo asincrono nel modo giusto, così posso godermi i benefici in termini di latenza.

Come posso verificare, in seguito, che i miei logger stiano funzionando in modo asincrono, utilizzando LMAX Dirsuptor nel processo?

+0

Stai ottenendo l'output del registro? –

+0

Lo faccio. Non sono sicuro che sia atterrato lì come dovrebbe: in modo asincrono. E ho perso la fiducia cieca per la magia nera di Eclipse/OSGi;). –

+0

A proposito, se hai risolto il problema di fornire 'sun.misc' nel tuo plugin Eclipse, ti dispiacerebbe rispondere alla domanda a cui ti sei collegato? –

risposta

9

Esistono due tipi di registratore asincrono, gestiti da classi diverse.

  1. tutti i logger asincrona: la classe AsyncLogger - attivato quando si utilizza AsyncLoggerContextSelector
  2. miscelazione sincronia con logger asincroni: la classe AsyncLoggerConfig - quando il file di configurazione ha <AsyncRoot> o <AsyncLogger> elementi annidati nella configurazione per <Loggers>.

Nel tuo caso stai facendo tutti i logger asincroni, quindi vuoi mettere il tuo breakpoint in AsyncLogger#logMessage(String, Level, Marker, Message, Throwable).

Un altro modo per verificare è impostare <Configuration status="trace"> nella parte superiore del file di configurazione. Questo produrrà i log log interni log4j su log4j è configurato. Dovresti vedere qualcosa come "Avvio di Distaccatore AsyncLogger ...". Se vedi questo tutti i logger sono asincroni.

+0

L'impostazione '' ha fatto il trucco, grazie! Dovresti aver letto [i documenti] (http://logging.apache.org/log4j/2.x/manual/configuration.html#StatusMessages) con più attenzione! Dopo aver impostato lo stato di configurazione, ricevo '2015-10-27 10: 13: 21,847 DEBUG Avvio del programma di interruzione di AsyncLogger con dimensione ringbuffer 262144 ...'. Grande! –

+0

IMPORTANTE: questa risposta sembra solo parzialmente corretta. Il metodo breakpoint funziona, ma il metodo '' non lo fa. Usando quest'ultimo, ottengo 'Starting AsyncLogger disgregatore ...' registra sia quando indico '-DLog4jContextSelector = org.apache.logging.log4j.core.async.AsyncLoggerContextSelector' flag e quando non lo faccio. Usando i breakpoint, vedo che in un caso (con il flag), i logger asincroni sono effettivamente colpiti, e nell'altro non lo sono. –

+0

@ JanŻankowski Sto vedendo risultati completamente diversi durante l'esecuzione di Log4j 2.5 con Disruptor 3.3.5 in JRE 8u102. Non vedo mai alcuna dichiarazione di registro con la parola "disgregatore" in esse. Tuttavia, se imposto correttamente tutti i logger per l'esecuzione in modo asincrono, vedo una serie di istruzioni di registro contenenti il ​​testo "AsyncLogger" e "AsyncContext". Inoltre, la rimozione della libreria dei disruptor causa l'arresto anomalo dell'applicazione durante il tentativo di eseguire tutti i logger in modo asincrono. –

3

Inserire un punto di interruzione in org.apache.logging.log4j.core.async.AsyncLoggerConfig#callAppenders. Quindi puoi guardare mentre l'evento viene messo nel disgregatore. Allo stesso modo org.apache.logging.log4j.core.config.LoggerConfig#callAppenders dovrebbe essere colpito per la registrazione sincrona o essere colpito dall'altro lato del disruptor per la registrazione asincrona (a quel punto tutto è di nuovo sincronizzato).

+0

Tale punto di interruzione verrà chiamato anche quando si configura tramite log4j2.xml? Ho allegato i sorgenti in Eclipse e impostato il punto di interruzione, ma l'esecuzione non si ferma. –

+0

Non dovrebbe importare credo. Impostare un altro punto di interruzione in 'org.apache.logging.log4j.core.config.LoggerConfig # callAppenders'. Questo dovrebbe essere colpito solo "dall'altra parte" del disgregatore. Se viene colpito direttamente dal tuo logger, allora non ha funzionato. – mvd

+1

Questo è quasi, ma non del tutto corretto. La classe 'AsyncLoggerConfig' non viene utilizzata quando tutti i logger sono asincroni (quando' AsyncLoggerContextSelector' è configurato). Vedi la mia risposta per maggiori dettagli. –

Problemi correlati