2012-03-15 25 views
8

Tôi gặp sự cố khi sử dụng% C trong ConversionPattern với AsyncAppender.Trong Log4J, tại sao% C trong bản in ConversionPattern '?' (dấu chấm hỏi) với AsyncAppender?

cấu hình Lo4J của tôi là:

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

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> 
    <appender name="console" class="org.apache.log4j.ConsoleAppender"> 
     <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="%d{yyyy/MM/dd HH:mm:ss,SSS} %C{1} - %m%n" /> 
     </layout> 
    </appender> 
    <appender name="async_console" class="org.apache.log4j.AsyncAppender"> 
     <param name="BufferSize" value="1000" /> 
     <appender-ref ref="console" /> 
    </appender> 
    <root> 
     <level value="debug" /> 
     <!-- 
     <appender-ref ref="console" /> 
     --> 
     <appender-ref ref="async_console" /> 
    </root> 
</log4j:configuration> 

Và mã kiểm tra của tôi là:

@Test 
public void testAsync() { 
    DOMConfigurator 
      .configure("src/test/resources/learningtest/log4j/log4j_test_async.xml"); 
    Logger log = Logger.getLogger(getClass()); 
    log.debug("Hello, world!"); 
    try { 
     Thread.sleep(1000); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
} 

Kết quả của mã kiểm tra là:

2012/03/15 11: 51: 22,570? - Chào thế giới!

Without AsynAppender, nó hoạt động tốt:

2012/03/15 11: 51: 06.002 Log4jTest - Hello, world!

Với% c (danh mục), nó cũng hoạt động tốt.

Tôi đang thiếu gì?

Vui lòng cho tôi biết.

Cảm ơn trước :-)

tham khảo:

http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html

Trả lời

9

Khi sử dụng "% C" hoặc "% M", Log4j sử dụng Throwable.getStackTrace để có được những stacktrace và sử dụng thông tin này để có được lớp người gọi và phương pháp. Vấn đề là khi sử dụng AsyncAppender, Throwable được tạo trong một luồng khác và stackTrace không chứa phương thức người gọi.

+5

AsyncAppender cũng có cờ locationInfo mà bạn có thể đặt. Trong trường hợp này,% C và% M sẽ hoạt động như mong đợi – cchabanois

+0

sau đó cách khắc phục sự cố? –

Các vấn đề liên quan