2014-06-25 10 views
10

Sto scrivendo un piccolo livello di trasformazione xml in Java. Ricevo xml tramite il servizio web, lo modifica e quindi invio il xml modificato a un altro sistema. Quindi attendo una risposta e restituisco la risposta al chiamante originale.Log4J RollingFileAppender Impossibile eseguire il roll file

System A -> Me -> System B -> Me -> System A 

voglio registrare la richiesta che ricevo, la richiesta di invio, la risposta che ricevo, e la richiesta di invio. Fondamentalmente voglio registrare l'xml in cui ogni freccia è nel mio diagramma.

Il mio problema è con il RollingFileAppender. Provo a rotolare a 10 MB, a volte lo fa e a volte non rotola. Se rotola un paio di volte, e poi si ferma, continuerà a rinominare i file da 3 a 4 e da 4 a 5 e così via.

La mia ipotesi migliore è che quando il segno di 10 MB viene attraversato, ci sono più thread che scrivono nel file di registro in modo che il file non possa essere rinominato. Spero che Log4J abbia una soluzione semplice per questo, ma se necessario, sono aperto a passare a un nuovo framework di registrazione. Grazie in anticipo per qualsiasi aiuto.

MODIFICA Ecco il file delle proprietà.

log4j.rootLogger=DEBUG, fileOut 

log4j.appender.fileOut=org.apache.log4j.RollingFileAppender 
log4j.appender.fileOut.File=/logs/log.log 
log4j.appender.fileOut.layout=org.apache.log4j.PatternLayout 
log4j.appender.fileOut.layout.ConversionPattern=%d %-5p %c - %m%n 
log4j.appender.fileOut.MaxFileSize=10MB 
log4j.appender.fileOut.MaxBackupIndex=10 
log4j.appender.fileOut.append=true 

EDIT 2 Questo è essenzialmente un urto, poiché questo post ha un basso numero di visualizzazioni. Credo che questo non possa essere un problema unico. Ogni aiuto è molto apprezzato. Grazie!

risposta

9

Log4J si inizializza a livello di classloader. All'interno di un certo classloader e dei suoi antenati, Log4J può essere inizializzato solo una volta e la stessa configurazione di Log4J si applica a tutte le chiamate di Log4J all'interno del classloader.

Fintantoché tutte le chiamate di registrazione vengono eseguite all'interno della stessa "area di autenticazione" di Log4J, Log4J sa come sincronizzare l'accesso al file fisico indicato dalla configurazione rolling appender; quando arriva il momento di rotolare, il rotolamento viene eseguito senza problemi.

Le cose diventano problematiche quando si dispone di due (o più) "domini di configurazione" di Log4J che utilizzano lo stesso file fisico per la configurazione a rotazione dell'appender. Questo potrebbe essere:

  1. due diverse applicazioni Web sulla stessa JVM fisico
  2. due diverse applicazioni web su due JVMs distinte
  3. applicazione web stessa orizzontalmente cluster in due JVMs distinti

(etc

Log4J semplicemente non ha modo di sapere chi altro, diverso da se stesso all'interno dello stesso dominio di configurazione Log4J, usa quel file. Quindi, quello che succede è che Log4J sul sistema A tenta di eseguire il rollup del file (perché non pensa che nessun altro processo acceda a quel file) e fallisce perché qualcuno sul Sistema B sta usando il file allo stesso tempo.

Questa è una limitazione nota di utilizzare appenders di file, e non si può davvero dare la colpa Log4J per questo: Log4J semplicemente non ha i mezzi di monitoraggio chi altro, diverso da quello Log4J nella stessa "regno configurazione", è usando quel file.

Per tale scenario di utilizzo, è possibile utilizzare l'appender socket Log4J.

Se lo scenario non coinvolge più "domini di configurazione" Log4J, provare ad aggiungere -Dlog4j.debug=true ai parametri JVM e vedere cosa sta succedendo esattamente durante l'operazione di scorrimento del file.

+0

Grazie per la spiegazione dettagliata. Vedo cosa ho fatto di sbagliato e come evitarlo in futuro. Sapevo che non poteva essere colpa di Log4J! – Joe

+0

@Joe se è di qualche aiuto, anch'io sapevo che non poteva essere colpa di Log4J ... – Isaac

+0

@Isaac puoi dirmi quali "parametri JVM dovrei aggiungere questa riga' -Dlog4j.debug = true' ? –

1

Ho anche affrontato lo stesso problema nella mia domanda.

Grazie a @Isaac ho scoperto che stavo eseguendo DOMConfigurator.configure per la stessa configurazione di registro in 2 applicazioni Web distribuite nel server delle applicazioni. Ho commentato uno di loro e il rollover è successo come previsto.

1

Per gli altri che arrivano qui, controlla che stai usando RollingFileAppender NOT FileAppender!

Gli errori di copia e incolla sono troppo facili, almeno per me.

+2

Perché stai aggiungendo un commento più di un anno dopo che la domanda ha avuto risposta? Dimostro chiaramente che sto usando RollingFileAppender. – Joe

+0

Era per persone come me, che cercano una risposta a un oscuro problema tecnico, quando hanno appena fatto un errore stupido. –