Per alcune circostanze, è necessario forzare immediatamente lo scaricamento nel file appender di logback. Ho trovato in docs questa opzione è abilitata per impostazione predefinita. Misteriosamente questo non funziona. Come vedo nelle fonti il processo sottostante coinvolge correttamente BufferedOutputSream
. C'è qualche problema con BufferedOutputSream.flush()
? Probabilmente questo è piuttosto correlato al problema del flushing.L'appender di file di logback non viene eseguito immediatamente
Aggiornamento: Ho trovato il problema su Windows XP Pro SP 3 e su Red Hat Enterprise Linux Server versione 5.3 (Tikanga). Ho usato queste librerie:
jcl-over-slf4j-1.6.6.jar
logback-classic-1.0.6.jar
logback-core-1.0.6.jar
slf4j-api-1.6.6.jar
Il logback.xml
è:
<configuration>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/somepath/file.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<fileNamePattern>file.log.%i</fileNamePattern>
<minIndex>1</minIndex>
<maxIndex>3</maxIndex>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>5MB</maxFileSize>
</triggeringPolicy>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
</encoder>
</appender>
<root level="debug">
<appender-ref ref="FILE"/>
</root>
</configuration>
Aggiornato: mi piacerebbe fornire una prova di unità, ma che non sembra così semplice. Lasciami descrivere la questione più chiaramente.
- evento di registrazione si è verificato
- evento è passato attraverso il file appender
- evento viene serializzato con il modello definito
- Serialized messaggio di evento viene passato al file appender ed è in procinto di scrivere per l'output stream
- La scrittura sullo stream è terminata, il flusso di output viene svuotato (ho controllato l'implementazione). Notare che è impostato su predefinito, pertanto il metodo
flush()
viene invocato in modo esplicito - Nessun risultato nel file!
Un po 'più tardi quando è stato eseguito il flusso di un buffer sottostante, l'evento appare nel file. Quindi la domanda è: il flusso di output garantisce un flush immediato?
A dire il vero, ho già risolto questo problema implementando il mio ImmediateRollingFileAppender
che sfrutta la funzione di sincronizzazione immediata di FileDescriptor
. Chiunque sia interessato può seguire this.
Quindi questo non è un problema di logback.
Su quale sistema operativo hai scoperto questo? –
Pubblica la configurazione di logback. – gresdiplitude
Puoi per favore definire "Misteriosamente questo non funziona"? Fornire un test unitario sarebbe molto utile. BTW, quale versione del JDK stai usando? – Ceki