Para algunas circunstancias, necesito forzar el vaciado inmediatamente en el appender de archivos de logback. He encontrado en docs esta opción está habilitada de forma predeterminada. Misteriosamente esto no funciona. Como veo en el proceso subyacente de fuentes implica BufferedOutputSream
correctamente. ¿Hay algún problema con BufferedOutputSream.flush()
? Probablemente esto esté más bien relacionado con el problema del enrojecimiento.El apéndice del archivo de inicio de sesión no se vacía inmediatamente
Actualización: Encontré el problema en Windows XP Pro SP 3 y en la versión 5.3 de Red Hat Enterprise Linux Server (Tikanga). utilicé estas librerías:
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
El logback.xml
es:
<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>
Actualizado: me gustaría proporcionar una prueba de unidad, pero eso no parece tan simple. Déjenme describir el problema más claramente.
- caso de la tala se produjo
- Evento traspasó appender archivo
- evento es de serie con el patrón definido
- mensaje serializado de eventos se pasa a la appender archivo y es punto de escribir a la salida corriente
- La escritura en la secuencia finaliza, la secuencia de salida se vacía (he comprobado la implementación). Tenga en cuenta que
immidiateFlush
es verdadero por predeterminado, por lo que el métodoflush()
se invoca explícitamente - ¡No hay resultados en el archivo!
Un poco más tarde, cuando fluyó un búfer subyacente, el evento aparece en el archivo. Entonces la pregunta es: ¿el flujo de salida garantiza una descarga inmediata?
Para ser sincero, ya he resuelto esto implementando mi propio ImmediateRollingFileAppender
que aprovecha la facilidad de FileDescriptor
de sincronización inmediata. Cualquier persona interesada puede seguir this.
Esto no es un problema de logback.
¿En qué sistema operativo ha descubierto esto? –
Publica tu configuración de inicio de sesión. – gresdiplitude
¿Puedes definir "Misteriosamente esto no funciona"? Proporcionar una prueba unitaria sería muy útil. Por cierto, ¿qué versión del JDK estás usando? – Ceki