2015-04-25 3 views
0

Я хотел бы настроить Logback с ConsoleAppender для использования stderr, в отличие от stdout. В частности, я хотел бы сделать это с помощью чистого кода, в отличие от файлов свойств/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; 
    } 
Смежные вопросы