Paul Nathan
Paul Nathan

Reputation: 40299

Configuring LogBack/ConsoleAppender to write to STDERR

I'd like to configure Logback with the ConsoleAppender to use stderr, as opposed to stdout. In particular, I would like to do this with pure code, as opposed to properties/xml files. Here's my attempt. Key notes regarding this code: when .reset() is called (as per the code below), nothing logs out at all. When .reset() is not called, the logs are all sent to STDOUT (thus indicating that the code below does not work at all).

What's the key bit to enable this?

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;
    }

Upvotes: 0

Views: 875

Answers (1)

Paul Nathan
Paul Nathan

Reputation: 40299

The trick is to add the encoder to the console and ensure that the loggers come from the context.

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;
    }

Upvotes: 2

Related Questions