2014-07-11 13 views
8

में विशेष स्तर फ़िल्टर करें, विशिष्ट स्तर को एपेंडर के साथ लॉग इन करने के लिए मुझे किस फ़िल्टर का उपयोग करना चाहिए? उदाहरण के लिए:Log4j2 apender

जावा:

LOGGER.debug("Debug message"); 
LOGGER.info("Info message"); 
LOGGER.warn("Warn message"); 
LOGGER.error("Error message"); 
LOGGER.fatal("Fatal message"); 

log4j2.xml:

<Configuration> 
    <Appenders> 
     <Console name="info-stdout-message"> 
      <PatternLayout pattern="[%logger{36}] %message %n" /> 
      <ThresholdFilter level="info"/> 
     </Console> 

     <Console name="detailed-stdout-message"> 
      <PatternLayout pattern="[%logger{36}] [%level] %message %n" /> 
     </Console> 

     <File name="file-appender" fileName="logs/debug.log"> 
      <PatternLayout pattern="%d{HH:mm:ss dd.mm} [%t] [%-5level] %logger{36} - %msg %n" /> 
     </File> 
    </Appenders> 

    <Loggers> 
     <Root level="debug"> 
      <AppenderRef ref="file-appender" level="debug" /> 
      <AppenderRef ref="info-stdout-message" level="info"/> 
      <AppenderRef ref="detailed-stdout-message" level="info"/> 
     </Root> 
    </Loggers> 
</Configuration> 

फ़ाइल उत्पादन ठीक है, लेकिन कंसोल में मैं इस तरह के परिणाम:

[application.Main] [INFO] Info message 
[application.Main] Info message 
[application.Main] [WARN] Warn message 
[application.Main] Warn message 
[application.Main] [ERROR] Error message 
[application.Main] Error message 
[application.Main] [FATAL] Fatal message 
[application.Main] Fatal message 

लेकिन मैं केवल INFO संदेशों को आउटपुट करने के लिए info-stdout-message एपेंडर की आवश्यकता है, जबकि detailed-stdout-message सभी EXEPT जानकारी आउटपुट करने के लिए। तो कंसोल आउटपुट इस तरह दिखना चाहिए:

[application.Main] Info message 
[application.Main] [WARN] Warn message 
[application.Main] [ERROR] Error message 
[application.Main] [FATAL] Fatal message 

फ़िल्टर सम्मान स्तर विरासत को रोकने के तरीके को कैसे नहीं ढूंढ सकता है। क्या इसे करना संभव है?

+0

क्या कॉन्फ़िगरेशन फ़ाइल को फ़िल्टरिंग स्तर सेट करने के बजाय प्रोग्रामेटिक रूप से ऐसा करने का कोई तरीका है? – testerjoe2

उत्तर

10

मैं 100% यह काम करेंगे यकीन नहीं है, लेकिन यह एक कोशिश दे:

<Console name="info-stdout-message"> 
    <PatternLayout pattern="[%logger{36}] %message %n" /> 
    <Filters> 

     <!-- Now deny warn, error and fatal messages --> 
     <ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/> 
     <ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/> 
     <ThresholdFilter level="fatal" onMatch="DENY" onMismatch="NEUTRAL"/> 

     <!-- This filter accepts info, warn, error, fatal and denies debug/trace --> 
     <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/> 
    </Filters> 
</Console> 
+0

काम नहीं करता है लेकिन काम के बहुत करीब है। ग्रुप फिल्टर ' 'टैग में फ़िल्टर करें, सूची के अंत तक ACCEPT नियम ले जाएं और मैं उत्तर स्वीकार करूंगा – ovnia

16

यहाँ दो सांत्वना appenders। एक std_out पर सभी ट्रेस, डीबग और जानकारी स्तर लॉग करता है, अन्य लॉग सभी चेतावनी, त्रुटि और घातक स्तर std_err पर लॉग करते हैं। यह बहुत उपयोगी है उदा। ग्रहण के भीतर std_err लाल प्रदर्शित होता है।

<Console name="STDOUT" target="SYSTEM_OUT"> 
    <PatternLayout pattern="%d{HH:mm:ss.SSS} (%6r) %-5p [%-7t] %F:%L %x - %m%n" /> 
    <Filters> 
     <ThresholdFilter level="warn" onMatch="DENY" onMismatch="ACCEPT" /> 
    </Filters> 
</Console> 

<Console name="STDERR" target="SYSTEM_ERR"> 
    <PatternLayout pattern="%d{HH:mm:ss.SSS} (%6r) %-5p [%-7t] %F:%L %x - %m%n" /> 
    <Filters> 
     <ThresholdFilter level="WARN" onMatch="ACCEPT" /> 
    </Filters> 
</Console> 
1

यह मुझे बहुत लंबे समय यह पता लगाने की log4j2.xml विन्यास फाइल के माध्यम से LogLevels की एक सीमा फिल्टर करने के लिए कैसे ले लिया। एंड में यह मेरे लिए काम किया:

<Filters> 
    <ThresholdFilter level="trace" /> 
    <ThresholdFilter level="info" onMatch="DENY" onMismatch="NEUTRAL" /> 
</Filters> 

इस मामले Log4J Level.DEBUG को Level.TRACE से सभी संदेशों को प्रवेश करेंगे में, Level.DEBUG नीचे सभी स्तरों नजरअंदाज कर दिया जाएगा।

0

https://logging.apache.org/log4j/2.0/manual/filters.html

नमूना विन्यास टुकड़ा बिल्कुल log4j2 छानने संभावनाओं की जांच करें

...  
<Console name="DEFAULT" target="SYSTEM_OUT"> 
    <PatternLayout> 
     <Pattern>[%d][%p][%c:%L:%M] - %m%n</Pattern> 
    </PatternLayout> 
    <Filters> 
     <RegexFilter regex="(?s).*(sql01|sql02|sql03).*" onMatch="DENY" onMismatch="NEUTRAL"/> 
    </Filters> 
</Console> 
... 
0

वास्तव में, अपने प्रश्न से ऐसा लगता है कि आप दो अलग अलग appenders, लेकिन दो अलग अलग पैटर्न है कि प्रयोग कर रहे हैं नहीं करना चाहती विभिन्न परिस्थितियों में। इसके लिए आपको केवल पैटर्न चयनकर्ता का उपयोग करना चाहिए।

<Console name="stdout-message"> 
     <ScriptPatternSelector defaultPattern="[%logger{36}] [%level] %message %n"> 
     <Script name="BeanShellSelector" language="bsh"><![CDATA[ 
      if (logEvent.getLevel() == Level.INFO) { 
      return "INFO"; 
      } else { 
      return null; 
      }]]> 
     </Script> 
     <PatternMatch key="INFO" pattern="[%logger{36}] %message %n"/> 
     </ScriptPatternSelector> 
    </Console> 
संबंधित मुद्दे