本文介紹了創(chuàng)建用于登錄的OutputStreamAppender的處理方法,對(duì)大家解決問(wèn)題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧!
問(wèn)題描述
對(duì)于我的Logback記錄器,我嘗試通過(guò)編程創(chuàng)建一個(gè)寫入ByteArrayOutputStream的OutputStreamAppender。以下是我到目前為止的情況:
// 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);
根據(jù)我讀到的所有內(nèi)容,這應(yīng)該是正確的。記錄器中的任何內(nèi)容都不會(huì)寫入流,并且OutputStreamAppender無(wú)法根據(jù)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)
我被LayoutWrappingEncoder.doEncode(LayoutWrappingEncoder)的警告和NPE難住了。我正在設(shè)置附加器上的編碼器。
推薦答案
翻了翻源代碼,發(fā)現(xiàn)必須在輸出流之前設(shè)置編碼器:
OutputStreamAppender<ILoggingEvent> appender= new OutputStreamAppender<>();
appender.setName( "OutputStream Appender" );
appender.setContext(context);
appender.setEncoder(encoder); // <-- must be set before outputstream
appender.setOutputStream(printStream);
這篇關(guān)于創(chuàng)建用于登錄的OutputStreamAppender的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,






