2013-03-15 10 views
8

Czy można zmodyfikować zdarzenie dziennika po dopasowaniu filtru?Logback: modyfikować wiadomość przez filtr?

Mam kontener sieciowy (Jersey), który rejestruje niezatłoczone wyjątki na poziomie ERROR. Ale, dla pewnych wyjątków (EofException), które rzuca serwer (Jetty), chciałbym je zapisać na niższym poziomie (INFO).

Mogę całkowicie usunąć te wiadomości, używając filtra logback, który pasuje do typu wyjątku (EofException). Ale nie znalazłem obsługiwanej metody modyfikacji zdarzenia dziennika, np. Zmień poziom dziennika.

+0

to będzie działać zamiast: http://stackoverflow.com/questions/6143929/how-do-i-not-log-a-particular-type-of-exception-in-logback –

+0

chcę coś w ten sposób, ale żeby zmienić poziom dziennika zamiast natychmiast odmówić wiadomości. –

+0

Czy wszystko jest w porządku, jeśli poziom "zmienia się" w ostatnim monencie, tuż przed tym, jak aplikant zarejestruje to? Jeśli tak, możesz napisać własnego aplikanta. –

Odpowiedz

8

Możesz symulować to zachowanie za pomocą TurboFiltera, logując własny zmodyfikowany komunikat za pomocą dostarczonego rejestratora i odrzucając oryginał.

Nie jestem jednak przekonany, że taki hak to dobry pomysł.

package com.example.logback; 

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.slf4j.Marker; 

import ch.qos.logback.classic.Level; 
import ch.qos.logback.classic.LoggerContext; 
import ch.qos.logback.classic.turbo.TurboFilter; 
import ch.qos.logback.core.spi.FilterReply; 

public class LogbackTest 
{ 
    private static class ModifyingFilter 
    extends TurboFilter 
    { 
     @Override 
     public FilterReply decide(
       Marker marker, 
       ch.qos.logback.classic.Logger logger, 
       Level level, 
       String format, 
       Object[] params, 
       Throwable t) 
     { 
      if (level == Level.ERROR && 
       logger.getName().equals("com.example.logback.LogbackTest") && 
       format.equals("Connection successful: {}")) 
      { 
       logger.debug(marker, format, params); 
       return FilterReply.DENY; 
      } 

      return FilterReply.NEUTRAL; 
     } 
    } 

    public static void main(String[] args) 
    { 
     LoggerContext lc = (LoggerContext)LoggerFactory.getILoggerFactory(); 
     lc.addTurboFilter(new ModifyingFilter()); 

     Logger logger = LoggerFactory.getLogger(LogbackTest.class); 
     logger.error("Connection successful: {}", "no problem", new RuntimeException("Hi")); 
    } 
}