我想我使用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中的错误或限制吗?
感谢。
答案 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()方法的字符不会被缓冲。