首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为Logback创建OutputstreamAppender

为Logback创建OutputstreamAppender
EN

Stack Overflow用户
提问于 2013-09-27 19:34:06
回答 1查看 5.6K关注 0票数 7

对于我的LogBack记录器,我试图以编程方式创建一个写入ByteArrayOutputStream的OutputStreamAppender。以下是我到目前为止所拥有的:

代码语言:javascript
复制
// Destination stream
ByteArrayOutputStream printStream = 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的输出正确初始化。

代码语言:javascript
复制
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感到困惑。我正在把编码器设置在附件上。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-29 03:15:05

在查看了源代码之后,我发现编码器必须在输出流之前设置:

代码语言:javascript
复制
OutputStreamAppender<ILoggingEvent> appender= new OutputStreamAppender<>();
appender.setName( "OutputStream Appender" );
appender.setContext(context);
appender.setEncoder(encoder);  // <-- must be set before outputstream
appender.setOutputStream(printStream);
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19058722

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档