2010-05-04 6 views
7

C'è solo un file. Ed è scritto contemporaneamente mentre le copie delle app Web vengono eseguite.Come si differenziano le sessioni di log4j in un file di registro da copie della stessa web-app?

Come si filtrano solo i messaggi di un registro di sessione da altre righe di registro?

+0

utilizzando quale contenitore? – skaffman

+0

Non sono sicuro di aver capito la tua domanda. Vuoi un file (log) per sessione web? – bert

+0

@skaffman Tomcat 6. @bert Tutto è scritto in un unico file, da tutte le sessioni. Voglio sentire da approcci diversi come te ne occupi. – EugeneP

risposta

12

L'utilizzo di un filtro servlet con informazioni NDC o MDC è il modo migliore che ho visto. Un rapido confronto tra i due è disponibile allo http://wiki.apache.org/logging-log4j/NDCvsMDC.

Ho trovato MDC ha funzionato meglio per me in passato. Ricorda che dovrai aggiornare il tuo file di proprietà log4j per includere qualsiasi versione tu preferisca (definizioni di pattern a http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html).

Un esempio completo di configurazione di MDC con un filtro servlet è disponibile su http://veerasundar.com/blog/2009/11/log4j-mdc-mapped-diagnostic-context-example-code/.

Un'opzione leggermente più semplice da configurare, ma significativamente inferiore: è possibile scegliere di stampare l'ID del thread (tramite il file delle proprietà) per ogni richiesta e assicurarsi che la prima cosa che si registra su ciascuna richiesta sia un identificativo di sessione . Non è corretto (o utile), ma può funzionare per applicazioni a basso volume.

5

È possibile impostare un messaggio contesto compreso l'identificativo della specifica istanza applicazione utilizzando org.apache.log4j.NDC, in questo modo:

String appInstanceId = "My App Instance 1"; 
org.apache.log4j.NDC.push(appInstanceId); 
// handle request 
org.apache.log4j.NDC.clear(); 

È possibile impostare il contesto durante l'inizializzazione dell'istanza web app, o all'interno del doPost() metodo dei tuoi servlet. Come suggerisce il nome, puoi anche nidificare i contesti all'interno di contesti con più chiamate push a diversi livelli.

Vedere la sezione "Contesti diagnostici nidificati" nello Log4J manual.

2

Ecco una pagina che imposta un filtro di MDC per il web-app ->http://rtner.de/software/MDCUserServletFilter.html

Essendo un filtro servlet che ti libererà dalla gestione MDC/NDC in ciascuno dei vostri servlet.

Ovviamente, è necessario modificarlo per salvare le informazioni più pertinenti all'app Web.

1

Se si desidera differenziare le sessioni nella stessa applicazione, MDC è la strada da seguire. Ma se vuoi differenziare le applicazioni web scrivendo sullo stesso file, MDC non ti aiuterà perché funziona su una base di thread. In tal caso, ho creato il mio appender che sa quale istanza dell'applicazione serve. Questo può essere fatto attraverso le proprietà di configurazione dell'appender. Tale appender dovrebbe incollare il nome dell'applicazione in ogni evento di registrazione come proprietà prima di scriverlo nel supporto e quindi è possibile utilizzare un layout per mostrare questo valore di proprietà nel file di testo in cui scrive. L'utilizzo di MDC in questo caso non funzionerà perché ogni thread dovrà avere MDC.put (applicationName) e questo è abbastanza brutto. MDC è valido solo per processi singoli, non per diversi processi. Se qualcuno conosce l'altro modo, mi piacerebbe sentire.

Problemi correlati