2013-03-15 8 views
8

フィルタに一致した後にログイベントを変更することは可能ですか?ログバック:フィルターでメッセージを変更しますか?

エラーレベルで未捕捉例外を記録するWebコンテナ(Jersey)があります。しかし、サーバー(Jetty)がスローする例外(EofException)については、それらをより低いレベル(INFO)でログに記録したいと思います。

例外タイプ(EofException)と一致するLogbackフィルタを使用して、これらのメッセージを完全に削除できます。しかし、私は、ログレベルを変更するなど、ログイベントを変更するためのサポートされている方法が見つかりませんでした。

+0

が、この作品ではなくなりますhttp://stackoverflow.com/questions/6143929/how-do-i-not-log-a-particular-type-of-exception-in-logback –

+0

私が何かをしたいですメッセージを完全に否定するのではなく、ログレベルを変更することです。 –

+0

アペンダーがログに記録する直前のレベルでレベルが「変更」されても構いませんか?もしそうなら、自分のアペンダーを書くことができます。 –

答えて

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")); 
    } 
} 
関連する問題