配置 LogBack/ConsoleAppender 以写入 STDERR

Configuring LogBack/ConsoleAppender to write to STDERR

我想使用 ConsoleAppender 配置 Logback 以使用 stderr,而不是 stdout。特别是,我想用纯代码而不是 properties/xml 文件来做到这一点。这是我的尝试。关于此代码的要点:当 .reset() 被调用时(按照下面的代码),什么都不会退出。当不调用.reset()时,日志全部发送到STDOUT(因此说明下面的代码根本不起作用)。

启用此功能的关键位是什么?

import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.ConsoleAppender;
import org.slf4j.LoggerFactory;

// stuff

  private static Logger buildLogger() {


        LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
        Logger logger = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(henson.class);
        lc.reset();

        PatternLayoutEncoder ple = new PatternLayoutEncoder();

        ple.setPattern("%date %level [%thread] %logger{10} [%file:%line] %msg%n");
        ple.setContext(lc);
        ple.start();

        ConsoleAppender<ILoggingEvent> ca = new ConsoleAppender<>();
        ca.setTarget("System.err");
        ca.setContext(lc);
        ca.start();
        logger.detachAndStopAllAppenders();
        logger.addAppender(ca);
        logger.setLevel(Level.DEBUG);

        return logger;
    }

诀窍是将编码器添加到控制台并确保记录器来自上下文。

private static Logger buildLogger() {

        LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
        lc.reset();
        Logger logger = lc.getLogger(henson.class);
        logger.detachAndStopAllAppenders();

        PatternLayoutEncoder ple = new PatternLayoutEncoder();
        ple.setPattern("%date %level [%thread] %logger{10} [%file:%line] %msg%n");
        ple.setContext(lc);
        ple.start();

        ConsoleAppender<ILoggingEvent> ca = new ConsoleAppender<>();
        ca.setTarget("System.err");
        ca.setContext(lc);
        ca.setEncoder(ple);
        ca.start();

        logger.addAppender(ca);

        logger.setLevel(Level.DEBUG);
        return logger;
    }