2010-10-28 10 views
8

ho un appender log4j definito come:Log4j - avere più appenders scrivere lo stesso file con uno che registra sempre

log4j.logger.com.example = DEBUG, filelog 

log4j.appender.filelog=org.apache.log4j.DailyRollingFileAppender 
log4j.appender.filelog.File=c:/app.log 
log4j.appender.filelog.layout=org.apache.log4j.PatternLayout 
log4j.appender.filelog.layout.ConversionPattern=%d | %m%n 
log4j.appender.filelog.DatePattern=.dd-MM-yyyy 

Nella mia classe, ho il registratore come:

Log logger = LogFactory.getLog(getClass()); 

Questo funziona correttamente. Voglio avere un logger che registra sempre determinati messaggi (non errori, ma cose come la durata delle transazioni). Se scrivo questi in DEBUG o INFO, non li vedrò se il livello di registro è cambiato. Penso di poterlo fare usando un altro appender che scrive sullo stesso file.

Questo è possibile avere due appenders scrivere allo stesso file? Come posso ottenere l'istanza del logger dove voglio usare il normale debug appender e l'appender transazionale nella stessa classe? Questi messaggi non saranno tutti nello stesso pacchetto, quindi non posso configurare un determinato pacchetto per accedere sempre. Dovrò avere questi appenders scrivere su file diversi, oppure possono entrambi ho recuperare il codice e avere qualcosa di simile:

Log alwaysLogger = LogFactory.getLog(ALWAYS); 
alwaysLogger.debug("This message will always be written regardless of the level set on the filelog appender"); 

Aggiornamento ho potuto scrivere a due file di log diversi, se necessario, ma come otterrei l'istanza del logger nella mia classe? Non voglio configurare un pacchetto/classe per utilizzare sempre un appender rispetto all'altro poiché le classi dovranno registrare le informazioni/i messaggi di errore ei messaggi "sempre" transazionali durante una normale esecuzione. C'è un modo per ottenere ciò di cui ho bisogno anche se scrive in due file di registro diversi?

risposta

6

Non credo log4j supporta davvero due appenders scrittura per lo stesso file a causa di problemi di sincronizzazione. La soluzione migliore sarebbe, se possibile, passare a slf4j utilizzando Logback come sistema di registrazione back-end dal momento che Logback è il successore di log4j e supporta anche più appendici che scrivono su un file. Controlla FileAppender ed è una modalità prudente.

Aggiornamento: dalla descrizione, sembra che si dovrebbe anche verificare markers. Hai solo bisogno di una sola istanza di logger, e puoi ottenere un controllo a grana fine usando i marcatori, perché con loro hai praticamente detto "questa dichiarazione di registro ha uno scopo speciale e deve essere registrata usando un appender appropriato". È inoltre possibile controllare l'appender del registro additivity, che viene in genere utilizzato quando si utilizzano due o più appendici per un'istruzione di registro.

+0

Ok, anche se ho bisogno di scrivere su un file separato, come posso ottenere entrambe le istanze del logger nel mio codice? Devo specificare quali pacchetti useranno un appender rispetto all'altro? Non voglio che ciò accada perché queste classi dovranno registrare le informazioni/i messaggi di errore e le righe "sempre". –

+2

Questo è corretto. È possibile configurare più appendici per lo stesso file che funzioneranno per un certo tempo, ma la rotazione del registro comporterà una delle appendici che scrive su un vecchio file e, infine, per registrare i messaggi persi. – TaninDirect

2

Per quanto ne so, l'istanziazione dei logger con un identificatore di classe del pacchetto & è solo una convenzione. Sei libero di creare istanze di logger multiple in qualsiasi classe e dare loro un identificatore.

Log alwaysLogger = LogFactory.getLog("a.b.c.ALWAYS"); 
Log sometimesLogger = LogFactory.getLog("a.b.c.SOMETIMES"); 

quanto riguarda la scrittura sullo stesso file, non hanno provato ma dovrebbe essere possibile, almeno da un unico filo. Potrebbe essere necessario scrivere il proprio appender piuttosto che fare affidamento su uno di quelli predefiniti.

-1

Sì. È possibile "risolvere il problema" per avere 2 appendici che scrivono sullo stesso file.

Checkout questa code + example:

Tutte le domande benvenuto.

0

ho avuto questo lavoro utilizzando AsyncAppender s. Ho avuto il mio appender principale che ha specificato un file per il login e ha fatto riferimento ad altri miei appendici.

ad es.

<appender name="top" class="org.apache.log4j.rolling.RollingFileAppender"> 
    <param name="file" value="myLog.log" /> 
</appender> 

<appender name="other" class="org.apache.log4j.AsyncAppender"> 
    <appender-ref ref="top" /> 
</appender> 

<logger name="com.example.MyCLass"> 
    <appender-ref ref="other" /> 
</logger> 

È possibile aggiungere altri filtri, o qualsiasi altra cosa agli altri appendici. Per quanto posso dire con la mia app, i log sembrano rotolare e i filtri dell'appender funzionano come previsto.

Problemi correlati