2014-11-26 9 views
6

Sto tentando di impostare la registrazione asincrona (per motivi di prestazioni) all'interno dei metodi web REST attualmente eseguiti in un server profilo liberty.log4j2: posizione per l'impostazione della proprietà di sistema Log4jContextSelector per la registrazione asincrona

Per fare questo, ho istituito la seguente proprietà:

System.setProperty("Log4jContextSelector", "org.apache.logging.log4j.core.async.AsyncLoggerContextSelector"); 

Il mio problema è che non importa dove faccio questo, a volte funziona e la registrazione è molto veloce, e qualche volta doesn' t.

Ho provato (a) nel costruttore della classe contenente tutti i metodi web REST (b) nel metodo filtro doFilter che viene chiamato prima del metodo REST (c) nel metodo del filtro init (d) nel metodo REST stesso

Nessuno di questi luoghi funziona in modo coerente.

Qualcuno può offrire una spiegazione per questo comportamento e, se possibile, un modo suggerito per risolvere il problema.

MODIFICA: Sembra che log4j sia inizializzato prima di chiamare setProperty. Quindi quello che devo fare è impostare la proprietà tramite il profilo liberty.

+0

@fnt No, non ho prove, non ho fatto confronti, quindi cambierò il mio commento. Ho solo un confronto con il logging standard qui [Binary logging performance - slide 23] (http://www.slideshare.net/cnbailey/websphere-technical-university-top-websphere-problem-determination-features). – Gas

+1

È possibile valutare [registrazione binario] (http://www-01.ibm.com/support/knowledgecenter/SSAW57_8.5.5/com.ibm.websphere.wlp.nd.multiplatform.doc/ae/twlp_confHPEL.html?cp = SSAW57_8.5.5% 2F3-0-2-9-1 & lang = it) opzione in Liberty in quanto ha prestazioni migliori rispetto alla registrazione standard. Forse sarà abbastanza buono per te. – Gas

+0

Buona lettura. https://springframework.guru/asynchronous-logging-with-log4j-2/ –

risposta

0

Quindi, apparentemente avevo bisogno di aggiungere una riga al file di jvm.options

-DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector 

Il file jvm.options si trova qui:

${server.config.dir}/jvm.options 

E questo elenco può essere trovato usando il link:

http://www-01.ibm.com/support/knowledgecenter/SSEQTP_8.5.5/com.ibm.websphere.wlp.doc/ae/rwlp_dirs.html?cp=SSEQTP_8.5.5%2F1-3-11-0-2-0

Nel mio caso e ': C: \ dell'ECLI pse \ runtime \ usr \ servers \ serverName

+0

Funzionerà se viene aggiunto agli argomenti VM della configurazione del server per Tomcat? –

9

Esiste un metodo non documentato per l'impostazione di questo valore per il progetto senza dover passare manualmente il valore della proprietà di sistema durante l'avvio.

Aggiungere un file denominato log4j2.component.properties al classpath. Questo può essere fatto nella maggior parte dei progetti Maven o Gradle salvandolo in src/main/resources.

Questo file è semplicemente il file java.util.Properties. Impostare il valore per il selettore di contesto aggiungendo la seguente riga al file.

Log4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector 

Log4j tenterà di leggere prima la proprietà di sistema. Se la proprietà di sistema è null, per impostazione predefinita tornerà ai valori memorizzati in questo file.

Il codice che esegue questa configurazione si trova in Log4jContextFactory.java:91.

File Location

1

Il mio problema è che non importa dove faccio questo, a volte funziona e la registrazione è molto veloce, e, a volte non è così.

Aggiungere quel codice in un blocco di inizializzazione statico nella classe che definisce il punto di ingresso principale.

public class MainClass { 
    // NOTE: Nothing can appear before this initializer 
    // NOTE: This initializer must be in the class that contains your entry point 
    static { 
     System.setProperty("Log4jContextSelector", 
      "org.apache.logging.log4j.core.async.AsyncLoggerContextSelector"); 
    } 

    public static void main(final String[] args) { 
     // Do anything you want to here 
    } 
} 

In base alle specifiche Java, l'inizializzazione statica avviene nell'ordine in cui viene dichiarata. Pertanto, è garantita la chiamata System.setProperty prima dell'inizializzazione di Log4j.

0

Log4j è stato inizializzato prima di chiamare il metodo principale. Quindi non è in grado di selezionare la proprietà Log4jContextSelector dal sistema e, per impostazione predefinita, funziona in modo sincrono.

Per verificare lo stesso: rimuovere la dipendenza dai disruptor, se il progetto è ancora in corso, allora non sta diventando asincrono.

Se si aggiunge la proprietà tramite -DLog4jContextSelector = org.apache.logging.log4j.core.async.AsyncLoggerContextSelector, quindi, dopo la rimozione del progetto di disruptor non salirà.

Se si utilizza tomcat, aggiungere le proprietà di sistema in catalina.properties. E non dimenticare di usare immediateFlush = "false".

Problemi correlati