2016-12-04 127 views
0

我正在学习Log4j,我正在使用的这本书解释了AsyncAppenders。我将缓冲区大小设置为128(LoggingEvents)。该书解释说,在达到缓冲区大小之前不会打印任何消息,但是我的程序会打印日志消息,而不管缓冲区大小如何。AsyncAppender不会在写入之前等待缓冲区已满

为什么会出现这种情况?我将不胜感激约AsyncAppenders任何其它指针,如果任何人有知识,用它们:)

的log4j.xml

<?xml version="1.0" encoding="UTF-8"?> 
    <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> 

    <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" 
    debug="true"> 

    <appender name="ASYNC" class="org.apache.log4j.AsyncAppender"> 
    <appender-ref ref="CONSOLE"/> 
    <param name="BufferSize" value="128"/> 
    </appender> 

    <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender"> 
    <layout class="org.apache.log4j.PatternLayout"> 
    <param name="ConversionPattern" value="%d %-5p [%t] - %m%n"/> 
    </layout> 
    </appender> 

    <logger name="org.example.christopher" additivity="false"> 
    <level value="debug"/> 
    <appender-ref ref="ASYNC"/> 
    </logger> 
    <root> 
    <priority value="debug"/> 
    </root> 
    </log4j:configuration> 

Java代码

package org.example.christopher; 

import org.apache.log4j.*; 
import org.apache.log4j.xml.DOMConfigurator; 


public class AsyncLogging{ 

private static Logger logger = Logger.getLogger(AsyncLogging.class.getPackage().getName()); 
private AsyncAppender asyncAppender = null; 
private ConsoleAppender consoleAppender = null; 

public AsyncLogging(){ 

try{ 
logger.setAdditivity(false); 
asyncAppender = (AsyncAppender) logger.getAppender("ASYNC"); 
asyncAppender.setBufferSize(128); 
} 
catch (Exception e){ 
System.out.println("error: " + e.toString()); 
} 

} 

public void doLogging(){ 
logger.debug("Debug 1"); 
logger.debug("Debug 2"); 
logger.debug("Debug 3"); 
//logger.debug("Debug 4"); 
//logger.debug("Debug 5"); 
} 


public static void main(String ... args){ 
AsyncLogging asyncLogging = new AsyncLogging(); 
asyncLogging.doLogging(); 
} 

} 

回答

1

无论是javadocsAsyncAppendersource code说在缓冲区满之前不会打印任何消息。事实上,根据我的代码阅读:

  1. AsyncAppender.Dispatcher线程,做每当一个事件被追加写入将被唤醒和缓冲区是空的。

  2. 一旦醒来,它将不会进入睡眠状态,直到缓冲区为空。

这几乎与您正在阅读的书所说的相反。 (假定已经正确地读取它。)

+0

“本示例只是设置缓冲区大小,以4为AsyncAppender 被使用。该AsyncAppender,只要将不打印任何消息的日志记录 事件的数量小于所述缓冲区大小一旦记录事件的数量超过缓冲区大小,缓冲区将被清空,并且所有消息都将被打印。“ Pro Apache Log4J第二版 –

+0

在这种情况下,这本书显然是不正确的。如果它说*“...它没有被指定......”*,那将是正确的。但是源代码与本书明显矛盾,并且源代码是确定性的。 –

+0

唯一可能的解释可能会使这本书排序正确的是,早期版本的'AsyncAppender'可能会这样工作。然而,从v1.2.8开始,代码中的预期行为就是“热切”的异步刷新......这是源代码易于访问的最早版本。 (全部在上面的Grepcode链接中。) –

相关问题