2015-04-25 58 views
0

我想用ConsoleAppender配置Logback以使用stderr,而不是stdout。特别是,我想用纯代码来做到这一点,而不是使用properties/xml文件。这是我的尝试。关于此代码的主要注意事项:当调用.reset()(根据以下代码)时,根本没有任何注销。当.reset()未被调用时,日志全部被发送到STDOUT(因此表明下面的代码根本不起作用)。配置LogBack/ConsoleAppender写入STDERR

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

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

回答

1

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

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