繁体   English   中英

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

[英]Log4J: cannot change bufferSize with bufferedIO = true at FileAppender

我想我使用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具有正确的缓冲区大小,所以我认为没有人覆盖我的配置。

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

谢谢。

我注意到,你从小写开始写了bufferedIO,从大写开始写了BufferSize。 默认情况下,Java区分大小写,因此请在构造函数中使所有参数看起来像(bufferSize应该是小写的)。

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

log4j 1.2.17

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

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

JDK API java.io.OutputStreamWriter

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM