Reputation: 40299
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
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