2013-03-15 13 views
8

È possibile modificare un evento di registro dopo aver abbinato un filtro?Logback: modifica messaggio tramite filtro?

Ho un contenitore Web (Jersey) che registra eccezioni non rilevate a livello di ERRORE. Ma, per alcune eccezioni (EofException) lanciate dal server (Jetty), vorrei registrarle a un livello inferiore (INFO).

Posso eliminare completamente questi messaggi utilizzando un filtro di accesso che corrisponde al tipo di eccezione (EofException). Ma non ho trovato un metodo supportato per modificare l'evento del registro, ad esempio, modificare il livello del registro.

+0

sarebbe questo lavoro invece: http://stackoverflow.com/questions/6143929/how-do-i-not-log-a-particular-type-of-exception-in-logback –

+0

voglio qualcosa in questo modo, ma per modificare il livello del registro invece di negare completamente il messaggio. –

+0

Stai bene se il livello "cambia" all'ultimo monente, appena prima che l'appatore lo registri? Se è così, potresti scrivere il tuo appender. –

risposta

8

È possibile simulare questo comportamento utilizzando un TurboFilter registrando il proprio messaggio modificato con il logger fornito e negando l'originale.

Non sono convinto che questo tipo di hack sia una buona idea, però.

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