状況によっては、logbackのファイルアペンダーですぐにフラッシュを強制する必要があります。ドキュメントで、このオプションはデフォルトで有効になっていることがわかりました。不思議なことに、これは機能しません。私がソースで見るように、基礎となるプロセスはBufferedOutputSream
正しく関与しています。何か問題はありますBufferedOutputSream.flush()
か?おそらく、これはむしろフラッシングの問題に関連しています。
更新:Windows XP ProSP3およびRedHatEnterprise Linux Serverリリース5.3(Tikanga)で問題が見つかりました。私はこれらのライブラリを使用しました:
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
は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>
更新: 単体テストを提供しますが、それはそれほど単純ではないようです。問題をより明確に説明させてください。
- ロギングのイベントが発生しました
- イベントはファイルアペンダーに渡されます
- イベントは定義されたパターンでシリアル化されます
- イベントのシリアル化されたメッセージがファイルアペンダーに渡され、出力ストリームに書き出されようとしています
- ストリームへの書き込みが終了し、出力ストリームがフラッシュされます(実装を確認しました)。
immidiateFlush
デフォルトではtrueであるため、メソッドflush()
は明示的に呼び出されることに注意してください - ファイルに結果はありません!
少し後で、基になるバッファがフローされたときに、イベントがファイルに表示されます。したがって、問題は次のとおりです。出力ストリームは即時フラッシュを保証しますか?
正直なところ、即時同期のImmediateRollingFileAppender
機能を活用する独自の機能を実装することで、これをすでに解決しています。FileDescriptor
興味のある人は誰でもこれをフォローできます。
したがって、これはログバックの問題ではありません。