对于某些情况下,我需要立即强制的logback的文件附加器冲洗。我在docs发现这个选项是默认启用。神秘地这不起作用。正如我在源看到潜在的过程涉及BufferedOutputSream
正确。 BufferedOutputSream.flush()
有没有问题?可能这与冲洗问题有关。的logback文件的appender冲不立即
更新: 我发现这个问题在Windows XP专业版SP 3和Red Hat Enterprise Linux服务器上发布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
为真 默认为明确调用 - 文件中无结果!
稍后,当某些基础缓冲区流动时,事件将出现在文件中。 所以,问题是:是否输出流保证立即冲洗?
说实话,我已经通过实施我自己的ImmediateRollingFileAppender
解决了这个问题,它利用了即时同步的设备FileDescriptor
。任何有兴趣的人都可以按照this。
所以这不是一个logback问题。
你发现了哪个操作系统? – 2012-08-09 06:41:50
发布您的logback配置。 – gresdiplitude 2012-08-09 06:47:16
你能否定义“神秘的这不起作用”?提供单元测试将非常有用。顺便说一下,你正在使用哪个版本的JDK? – Ceki 2012-08-09 15:41:26