Logback file appender nicht Spülen Sie sofort
Für einige Umstände, die ich brauche, um zu erzwingen, flushing, logback file appender sofort. Ich gefunden habe in docs diese option ist standardmäßig aktiviert. Auf mysteriöse Weise funktioniert das nicht. Wie ich sehe, in den Quellen zugrunde liegende Prozess beinhaltet BufferedOutputSream
richtig. Gibt es irgendwelche Probleme mit BufferedOutputSream.flush()
? Wahrscheinlich ist dies eher im Zusammenhang mit der Spülung Problem.
Update:
Ich fand das Problem auf Windows XP Pro SP 3 und auf Red Hat Enterprise Linux Server release 5.3 (Tikanga).
Ich habe diese libs:
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
Den logback.xml
ist:
<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>
Aktualisiert:
Ich würde bieten ein Gerät testen, aber das scheint nicht so einfach.
Lassen Sie mich beschreiben, das Problem deutlicher.
- Ereignis-Protokollierung eingetreten ist
- - Ereignis übergeben wird, in den Datei-appender
- Veranstaltung serialisiert wird mit den vorgegebenen Muster
- Serialisierten Nachricht der Veranstaltung wird an den Datei-appender und ist
darüber zu schreiben, um die Ausgabe-stream - Schreiben in den stream beendet ist, wird der Ausgabe-stream geleert wird (ich habe
überprüft die Umsetzung). Beachten Sie, dassimmidiateFlush
ist true
Standard-so-Methodeflush()
aufgerufen wird ausdrücklich - Kein Ergebnis in der Datei!
Etwas später, wenn einige zugrunde liegenden Puffer wurde, endete die Veranstaltung erscheint in der Datei.
Die Frage ist also: hat output-stream garantieren die unverzügliche flush?
Um ehrlich zu sein hab ich auch schon lösen, indem die Umsetzung meiner eigenen ImmediateRollingFileAppender
nutzt und Einrichtung von FileDescriptor
sofortige Synchronisierung. Wer Interesse an Folgen können diese.
So ist dies nicht ein logback Problem.
Posten Sie Ihre logback-Konfiguration.
Können Sie bitte definieren Sie "auf Mysteriöse Weise" so funktioniert das nicht"? Die Bereitstellung eines unit-Tests sehr nützlich sein würde. BTW, welche version des JDK benutzt du?
InformationsquelleAutor Viktor Stolbin | 2012-08-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Entschied ich mich, um meine Lösung für alle.
Lassen Sie mich klären Sie zunächst, dass dies nicht ein logback Problem ist und nicht ein JRE-problem. Dies ist beschrieben in der javadoc und in der Regel nicht ein Problem sein, bis Sie konfrontiert werden, mit einigen old-school-integration-Lösungen über die Datei-Synchronisierung.
So ist dies ein logback appender umgesetzt, Spülen Sie sofort:
Dies ist entsprechenden output-stream utility Klasse. Weil einige Methoden und Felder der original -
ResilientOutputStreamBase
sollte für die Ausweitung der zunächst verpackt zugriffsmodifizierer musste ich verlängernOutputStream
statt und kopieren Sie einfach die Ruhe und unverändert vonResilientOutputStreamBase
undResilientFileOutputStream
zu diesem neuen. Ich habe gerade die Anzeige der geänderte code:Und schließlich die config:
InformationsquelleAutor Viktor Stolbin
Haben Sie einen guten job gemacht - gut gemacht. Hier ist ein Vorschlag, um es präziser:
In der Konfiguration, die Sie haben zu verwenden, bestimmte encoder:
Nicht getestet. Wahrscheinlich wird es Probleme bei der Anzeige mit Feldern, , die zu verwenden logback
ch.qos.logback.core.recovery
Paket selbst.Durch die Art und Weise, lade ich Sie zu senden Sie eine bug-Bericht zu logback zu bekommen eine zusätzliche option
immediateSync
aufLayoutWrappingEncoder
.Erstellt ein JIRA jira.qos.ch/browse/LOGBACK-735
dieser Ausgabestrom wird eine ResilientFileOutputStream,und es ist nicht erweitert, von FileOutputStream,so tut es nicht, hat der getFD () - Methode.
Recht. Ich aktualisiert meine Antwort... aber ich habe nicht mehr als getestet, bevor
Ah dreck. Sieht aus wie dies wäre die Reflexion ziehen Sie die geschützte os-Feld aus ResilientOutputStreamBase.
InformationsquelleAutor Yves Martin
Viele monitoring-middleware finden Sie die neuen Veranstaltungen per Scheck für Aktualisierungen der Zeitstempel und die Dateigröße. Aus diesem Grund müssen die Zeit, die das Ereignis aufgezeichnet wird, der Zeitstempel und die Dateigröße aktualisiert.
Dieser Klasse lösen könnte, es
Set MyFileAppender Klasse für Appen.
Ich hoffe, dass ist logback löst dieses problem.
InformationsquelleAutor cotton