Log4J:无法在FileAppender中使用bufferedIO = true更改bufferSize

时间:2011-04-18 12:44:35

标签: java log4j

我想我使用log4j遇到了问题。我正在尝试启用bufferedio,但是8KB的默认缓冲区大小对于我当前的需求来说太大了

<appender name="MyAppender" class="org.apache.log4j.FileAppender">
    <param name="bufferedIO" value="true"/>
    <param name="bufferSize" value="512"/>
    <param name="Append" value="true"/>
    <param name="File" value="C:/MyMonitor.log"/>
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d{dd/MM/yyyy HH:mm:ss}|%m%n"/>
    </layout>
</appender>

<logger name="com.mypackage.MyMonitor">
    <level value="debug"/>
    <appender-ref ref="MyAppender"/>
</logger>

我已经为缓冲区尝试了不同的大小,但只有当缓冲区达到8KB时才会写入文件。

我在Log4J中找不到任何描述此问题的错误,即使我找到了另一个遇到同样问题的人(没有任何解决方案)。

启用Log4J调试显示我的appender具有正确的buffersize,所以我认为没有人覆盖我的配置。

知道我做错了什么吗?它真的是Log4J中的错误或限制吗?

感谢。

2 个答案:

答案 0 :(得分:1)

我注意到,你从小写开始写了bufferedIO,从大写开始写了BufferSize。默认情况下,Java区分大小写,因此请将所有参数设置为constructor(bufferSize应该小写)。

另据我所知,FileAppender已被弃用。 WriterAppender是最接近的替代品。

答案 1 :(得分:0)

log4j 1.2.17

转到源代码,我发现 DailyRollingFileAppender 使用 java.io.OutputStreamWriter 将字符写入日志文件。 Threre是 OutputStreamWriter 中的缓冲区。在jdk 1.7中,大小为8k(8192)

由于这个第二个缓存,你会发现:如果设置 log4j.appender.file.bufferSize = 8192 ,即使日志数据超过8192(&lt; = 8192 * 2),也没有日志文件中的数据。原因是第二个缓存(OutputStreamWriter)保存了第一个8192个字符,而DailyRollingFileAppender缓存则保留了剩余的字符。

JDK API java.io.OutputStreamWriter

  

每次调用write()方法都会导致在给定字符上调用编码转换器。生成的字节在写入底层输出流之前累积在缓冲区中。可以指定此缓冲区的大小,但默认情况下,它足够大,可用于大多数用途。请注意,传递给write()方法的字符不会被缓冲。