2013-09-27 67 views
3

的OutputstreamAppender對於我的logback記錄,我試圖創造程式設計的OutputStreamAppender寫入到一個ByteArrayOutputStream。這是我到目前爲止:創造的logback

// Destination stream 
ByteArrayOutputStream stream = new ByteArrayOutputStream(); 

// Get LoggerContext from SLF4J 
LoggerContext context = (LoggerContext)LoggerFactory.getILoggerFactory(); 

// Encoder 
PatternLayoutEncoder encoder = new PatternLayoutEncoder(); 
encoder.setContext(context); 
encoder.setPattern("%d{HH:mm:ss} %-5level %logger{36} - %msg%n"); 
encoder.start(); 

// OutputStreamAppender 
OutputStreamAppender<ILoggingEvent> appender= new OutputStreamAppender<>(); 
appender.setName("OutputStream Appender"); 
appender.setContext(context); 
appender.setOutputStream(printStream); 
appender.setEncoder(encoder); 

appender.start(); 

Logger log = context.getLogger(this.getClass()); 
log.addAppender(appender); 

log.info("text from logger"); 

// Output to stdout logback status 
StatusPrinter.print(context); 

根據我已閱讀的一切,這應該是正確的。從記錄器沒有被寫入流和OutputStreamAppender未能根據從StatusPrinter輸出正確初始化:

15:26:30,330 |-WARN in ch.qos.logback.core.OutputStreamAppender[OutputStream Appender] - Encoder has not been set. Cannot invoke its init method. 
15:26:30,335 |-ERROR in ch.qos.logback.core.OutputStreamAppender[OutputStream Appender] - Appender [OutputStream Appender] failed to append. java.lang.NullPointerException 
    at java.lang.NullPointerException 
    at at ch.qos.logback.core.encoder.LayoutWrappingEncoder.doEncode(LayoutWrappingEncoder.java:135) 
    at at ch.qos.logback.core.OutputStreamAppender.writeOut(OutputStreamAppender.java:188) 
    at at ch.qos.logback.core.OutputStreamAppender.subAppend(OutputStreamAppender.java:212) 
    at at ch.qos.logback.core.OutputStreamAppender.append(OutputStreamAppender.java:103) 
    at at ch.qos.logback.core.UnsynchronizedAppenderBase.doAppend(UnsynchronizedAppenderBase.java:88) 
    at at ch.qos.logback.core.spi.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:48) 
    at at ch.qos.logback.classic.Logger.appendLoopOnAppenders(Logger.java:272) 
    at at ch.qos.logback.classic.Logger.callAppenders(Logger.java:259) 
    at at ch.qos.logback.classic.Logger.buildLoggingEventAndAppend(Logger.java:441) 
    at at ch.qos.logback.classic.Logger.filterAndLog_0_Or3Plus(Logger.java:395) 
    at at ch.qos.logback.classic.Logger.info(Logger.java:599) 

我被警告,NPE在LayoutWrappingEncoder.doEncode(LayoutWrappingEncoder)難倒。我正在設置Appender上的編碼器。

回答

4

周圍的源代碼戳後,我發現,編碼器已經輸出流之前進行設置:

OutputStreamAppender<ILoggingEvent> appender= new OutputStreamAppender<>(); 
appender.setName("OutputStream Appender"); 
appender.setContext(context); 
appender.setEncoder(encoder); // <-- must be set before outputstream 
appender.setOutputStream(printStream);