2013-03-15 110 views
8

匹配過濾器後可以修改日誌事件嗎?Logback:通過過濾器修改消息?

我有一個Web容器(澤西島)在錯誤級別記錄未捕獲的異常。但是,對於服務器(Jetty)拋出的某些異常(EofException),我想將它們記錄在較低級別(INFO)。

我可以使用匹配異常類型(EofException)的Logback過濾器完全刪除這些消息。但是我還沒有找到支持修改日誌事件的方法,例如,更改日誌級別。

+0

將這項工作,而不是:http://stackoverflow.com/questions/6143929/how-do-i-not-log-a-particular-type-of-exception-in-logback – 2013-03-15 20:51:37

+0

我想要的東西像那樣,但改變日誌級別而不是徹底否認這條消息。 – 2013-03-15 21:00:34

+0

如果在appender記錄它之前最後一個成分的等級「變化」,你還好嗎?如果是這樣,你可以寫你自己的appender。 – 2013-03-15 21:10:19

回答

8

您可以使用TurboFilter通過使用提供的記錄器記錄自己修改的消息並拒絕原始文件來模擬此行爲。

雖然我不相信這種黑客是個好主意。

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