2013-03-15 3 views
8

Es ist möglich, ein Protokollereignis nach dem Abgleichen eines Filters zu ändern?Logback: Nachricht über Filter ändern?

Ich habe einen Web-Container (Jersey), der nicht erfasste Ausnahmen auf der ERROR-Ebene protokolliert. Aber für bestimmte Ausnahmen (EofException), die vom Server (Jetty) geworfen werden, möchte ich sie auf einer niedrigeren Ebene (INFO) protokollieren.

Ich kann diese Nachrichten vollständig mit einem Logback-Filter löschen, der auf den Ausnahmetyp (EofException) passt. Aber ich habe keine unterstützte Methode zum Ändern des Protokollereignisses gefunden, z. B. die Protokollstufe ändern.

+0

Würde diese Arbeit statt: http://stackoverflow.com/questions/6143929/how-do-i-not-log-a-particular-type-of-exception-in-logback –

+0

Ich möchte etwas so, aber um die Log-Ebene zu ändern, anstatt die Nachricht direkt zu verweigern. –

+0

Geht es dir gut, wenn sich der Level im letzten Monat ändert, kurz bevor der Appender es protokolliert? Wenn ja, könnten Sie Ihren eigenen Appender schreiben. –

Antwort

8

Sie können dieses Verhalten mithilfe eines TurboFilters simulieren, indem Sie Ihre eigene geänderte Nachricht mit dem bereitgestellten Protokollierer protokollieren und das Original verweigern.

Ich bin nicht davon überzeugt, dass diese Art von Hack eine gute Idee ist, obwohl.

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