2013-03-15 7 views
8

फ़िल्टर से मेल खाने के बाद लॉग ईवेंट को संशोधित करना संभव है?लॉगबैक: फ़िल्टर के माध्यम से संदेश संशोधित करें?

मुझे एक वेब कंटेनर (जर्सी) मिला है जो ERROR स्तर पर बेजोड़ अपवादों को लॉग करता है। लेकिन, कुछ अपवादों (EofException) सर्वर (जेटी) द्वारा फेंकने के लिए, मैं उन्हें निम्न स्तर (INFO) पर लॉग करना चाहता हूं।

मैं उन संदेशों को पूरी तरह से लॉगबैक फ़िल्टर का उपयोग कर छोड़ सकता हूं जो अपवाद प्रकार (EofException) से मेल खाता है। लेकिन मुझे लॉग इवेंट को संशोधित करने के लिए एक समर्थित विधि नहीं मिली है, उदाहरण के लिए, लॉग स्तर बदलें।

+0

इस काम के बजाय चाहेंगे: http://stackoverflow.com/questions/6143929/how-do-i-not-log-a-particular-type-of-exception-in-logback –

+0

मैं कुछ चाहते हैं इस तरह, लेकिन संदेश के इनकार करने के बजाय लॉग स्तर को बदलने के बजाय। –

+0

क्या आप ठीक हैं अगर अंतिम मॉन्टर पर स्तर "परिवर्तन" करता है, तो एपेंडर लॉग से ठीक पहले? यदि ऐसा है, तो आप अपना खुद का एपेंडर लिख सकते हैं। –

उत्तर

8

आप प्रदान किए गए लॉगर के साथ अपना स्वयं का संशोधित संदेश लॉग करके और मूल को अस्वीकार कर टर्बोफ़िल्टर का उपयोग करके इस व्यवहार को अनुकरण कर सकते हैं।

मुझे विश्वास नहीं है कि इस तरह के हैक एक अच्छा विचार है, हालांकि।

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")); 
    } 
} 
संबंधित मुद्दे