java logback,java – 为Logback创建OutputstreamAppender

对于我的LogBack记录器,我试图以编程方式创建一个写入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 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);

根据我读过的所有内容,这应该是正确的. Logger中没有任何内容写入流,并且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)

我对LayoutWrappingEncoder.doEncode(LayoutWrappingEncoder)中的警告和NPE感到困惑.我在Appender上设置编码器.

解决方法:

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

OutputStreamAppender appender= new OutputStreamAppender<>();

appender.setName( "OutputStream Appender" );

appender.setContext(context);

appender.setEncoder(encoder); //

appender.setOutputStream(printStream);

标签:java,logback

来源: https://codeday.me/bug/20190529/1176583.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目录 ..........................................................................................................................I 译者声明.......................................................................................................................... 1 发布记录.......................................................................................................................... 1 1. 介绍.......................................................................................................................... 2 1.1. 什么是 logback ............................................................................................ 2 1.2. 第一步 ........................................................................................................ 2 1.2.1. 必要条件.............................................................................................. 2 1.3. 构建 logback................................................................................................ 5 2. 体系结构................................................................................................................... 6 2.1. logback 的体系结构 ..................................................................................... 6 2.2. LoggerAppender 和 Layout ........................................................................ 6 2.2.1. Logger 上下文 ...................................................................................... 6 2.2.2. 有效级别(Level)即级别继承 ............................................................. 7 2.2.3. 打印方法和基本选择规则 ..................................................................... 9 2.2.4. 获取 Logger........................................................................................ 10 2.2.5. Appender 和 Layout..............................................................................11 2.2.6. 参数化记录 ........................................................................................ 13 2.2.7. 更好的替代方法 ................................................................
Logback 是一个基于 SLF4J API 的日志框架,可以用于 Java 应用程序中的日志记录。下面是使用 Logback 的步骤: 1. 添加 Logback 的依赖 在 Maven 项目中,可以通过以下方式添加 Logback 的依赖: ```xml <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency> ``` 2. 创建 Logback 配置文件 创建一个名为 `logback.xml` 的文件,放在项目的 `src/main/resources` 目录下。以下是一个简单的 Logback 配置文件的示例: ```xml <configuration> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <root level="debug"> <appender-ref ref="console" /> </root> </configuration> ``` 上述配置文件定义了一个名为 `console` 的控制台输出器,并将日志级别设置为 `debug`。 3. 在代码中使用 Logback 在代码中使用 Logback 的方式与使用 SLF4J 相同。例如: ```java import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class MyClass { private static final Logger logger = LoggerFactory.getLogger(MyClass.class); public void doSomething() { logger.debug("Doing something..."); } } ``` 在上述示例中,通过 `LoggerFactory.getLogger(MyClass.class)` 方法获取一个名为 `MyClass` 的 Logger 对象,并使用 `logger.debug("Doing something...")` 方法记录 DEBUG 级别的日志。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值