2015-07-13 2 views
0

Я изучаю JAVA и сегодня играю с Logback. В качестве упражнения для себя я написал пользовательский «appender» для записи журналов (для Spring) в коллекцию MongoDB. После отслеживания ошибки я обнаружил, что если мой appender генерирует исключение, то это просто игнорируется, и приложение продолжает работать, но с данным регистратором, о котором идет речь, теперь умер.Исключительное игнорирование внутреннего исключения логина

место генерируется исключение:

public class MongoDBAppender extends AppenderBase<ILoggingEvent> { 
    ... 
    protected void append(ILoggingEvent event) { 
    ... 
    throw new RuntimeException("My example exception!"); 

Как я хочу открыть одну сессию MongoDB в самом начале, а затем начать регистрацию, а затем получить Spring собирается, программно установить этот Appender Собирается:

MongoClient mongoClient = new MongoClient("localhost:27017"); 

LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); 
PatternLayoutEncoder ple = new PatternLayoutEncoder(); 
ple.setContext(lc); 
ple.setPattern("%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n"); 
ple.start(); 

MongoDBAppender mongoDBAppender = new MongoDBAppender(); 
mongoDBAppender.setContext(lc); 
mongoDBAppender.setEncoder(ple); 
mongoDBAppender.setmongoDBName("test"); 
mongoDBAppender.setmongoDBCollectionName("my_log"); 
mongoDBAppender.start(); 

Logger logger = (Logger) LoggerFactory.getLogger("org.springframework"); 
logger.addAppender(mongoDBAppender); 
logger.setLevel(Level.INFO); 
logger.setAdditive(false); 

Другие регистраторы определяются как обычно в logback.xml.

Итак, как есть, это приложение работает правильно, но ничего не регистрируется для org.springframework. Если изменить файл logback.xml начать как:

<configuration debug="true"> 

тогда я получаю полный отладочный вывод из самого Logback, да и то я вижу мое исключение бросают.

Есть ли способ получить этот вид вывода тогда и только тогда, когда есть ошибка?

ответ

0

После некоторого копания, кажется, что метод doAppend в AppenderBase ловит исключения и регистрирует их в журнале внутренней Logback: это только когда-либо отображается, если мы использовали опцию <configuration debug="true">. Метод doAppend - это то, что на самом деле вызывает мой заказ append.

Мой рабочий процесс: поймайте все исключения самостоятельно в append, а затем зарегистрируйте их на моем собственном регистраторе (для MongoDBAppender). Затем мы можем решить, как (или если) отображать такие сообщения.

Смежные вопросы