मैं एक लकड़हारे के लिए अलग-अलग स्तरों पर अलग-अलग स्तरों पर लॉग करने के लिए लॉगबैक को कैसे कॉन्फ़िगर कर सकता हूं?


156

मैं एक लकड़हारे के लिए अलग-अलग स्तरों पर अलग-अलग स्तरों पर लॉग करने के लिए लॉगबैक को कैसे कॉन्फ़िगर कर सकता हूं ?

उदाहरण के लिए, निम्न लॉगबैक कॉन्फ़िगरेशन को देखते हुए, लॉगबैक INFOसंदेशों को रिकॉर्ड STDOUTऔर ERRORसंदेश जाएगा STDERR?

(ध्यान दें कि यह उदाहरण अध्याय 3: लॉगबैक कॉन्फ़िगरेशनlogback-examples/src/main/java/chapters/configuration/sample4.xml में दिखाया गया उदाहरण है ।

<configuration>
  <appender name="STDOUT"
   class="ch.qos.logback.core.ConsoleAppender">
   <encoder>
     <pattern>
        %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
      </pattern>
    </encoder>
  </appender>
  <appender name="STDERR"
   class="ch.qos.logback.core.ConsoleAppender">
   <encoder>
     <pattern>
        %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
      </pattern>
    </encoder>
    <target>System.err</target>
  </appender>
  <!-- What is the effective level of "chapters.configuration"? -->
  <logger name="chapters.configuration" level="INFO" additivity="false">
    <appender-ref ref="STDOUT" />
  </logger>
  <logger name="chapters.configuration" level="ERROR" additivity="false">
    <appender-ref ref="STDERR" />
  </logger>

  <!-- turn OFF all logging (children can override) -->
  <root level="OFF">
    <appender-ref ref="STDOUT" />
  </root>
</configuration>

1
एक पॉप क्विज़ में मैं कहूंगा - उच्चतर :), लेकिन गंभीरता से, यदि आप दोनों स्तरों पर लॉग इन करते हैं तो आपका कंसोल / स्टडआउट क्या कहता है?
kostja

दूसरे विचार पर, मुझे लगता है कि जिस प्रश्न का उत्तर देने में मुझे अधिक दिलचस्पी है, वह है, "मैं एक लकड़हारे के लिए अलग-अलग स्तरों पर विभिन्न स्तरों पर कैसे लॉग इन कर सकता हूं"?
डेरेक महार

आपको मेरे द्वारा बनाया गया फ़िल्टर पसंद आ सकता है ।
मातरिनस

@kostja यह सही जवाब है। levels are ordered as follows: TRACE < DEBUG < INFO < WARN < ERROR.
एलेक्स78191

जवाबों:


62

अद्यतन: ग्रूवी का उपयोग करते हुए सभी कॉन्फ़िगरेशन आधारित दृष्टिकोण के लिए डीन हिलर का उत्तर देखें

-

आप लॉगबैक फिल्टर के साथ कुछ दिलचस्प चीजें कर सकते हैं । नीचे विन्यास केवल stderr को चेतावनी और त्रुटि संदेश प्रिंट करेगा, और सब कुछ stdout करने के लिए।

logback.xml

<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
  <target>System.out</target>
  <filter class="com.foo.StdOutFilter" />
   ...
</appender>

<appender name="stderr" class="ch.qos.logback.core.ConsoleAppender">
  <target>System.err</target>
  <filter class="com.foo.ErrOutFilter" />
   ...
</appender>

<logger name="mylogger" level="debug">
    <appender-ref ref="stdout" />
    <appender-ref ref="stderr" />
</logger>

com.foo.StdOutFilter

public class StdOutFilter extends ch.qos.logback.core.filter.AbstractMatcherFilter
{

    @Override
    public FilterReply decide(Object event)
    {
        if (!isStarted())
        {
            return FilterReply.NEUTRAL;
        }

        LoggingEvent loggingEvent = (LoggingEvent) event;

        List<Level> eventsToKeep = Arrays.asList(Level.TRACE, Level.DEBUG, Level.INFO);
        if (eventsToKeep.contains(loggingEvent.getLevel()))
        {
            return FilterReply.NEUTRAL;
        }
        else
        {
            return FilterReply.DENY;
        }
    }

}

com.foo.ErrOutFilter

public class ErrOutFilter extends ch.qos.logback.core.filter.AbstractMatcherFilter
{

    @Override
    public FilterReply decide(Object event)
    {
        if (!isStarted())
        {
            return FilterReply.NEUTRAL;
        }

        LoggingEvent loggingEvent = (LoggingEvent) event;

        List<Level> eventsToKeep = Arrays.asList(Level.WARN, Level.ERROR);
        if (eventsToKeep.contains(loggingEvent.getLevel()))
        {
            return FilterReply.NEUTRAL;
        }
        else
        {
            return FilterReply.DENY;
        }
    }

}

5
आप logback.qos.ch/manual/filters.html#levelFilter का भी उपयोग कर सकते हैं जो आपके लिए कक्षाएं कार्यान्वित करेगा ..
Dejell

@Odelya हाँ, आप स्तर फ़िल्टर का उपयोग कर सकते हैं लेकिन आपको कई फ़िल्टर परिभाषित करने होंगे क्योंकि कॉन्फ़िगरेशन केवल सुनने के लिए एक SINGLE स्तर को स्वीकार करता है।
उरिय्याह बढ़ई

13
@ यूरिया लॉगबैक.कोस .ch/ manual/ filters.html # thresholdFilter एक लेवल के बजाय एक रेंज लेगा
एंटनी स्टब्स

11
सही है, लेकिन yecch !!! ऐसी सरल आवश्यकता के लिए जावा प्रोग्रामिंग की आवश्यकता नहीं होनी चाहिए।
केविन क्लाइन 19

1
आपको stderr के लिए फ़िल्टर की आवश्यकता नहीं है। इस लिंक को देखें stackoverflow.com/questions/13179773/…
डीन हिलर

84

मेरा मानना ​​है कि यह सबसे सरल उपाय होगा:

<configuration>
    <contextName>selenium-plugin</contextName>
    <!-- Logging configuration -->  
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <Target>System.out</Target>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <encoder>
            <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%level] %msg%n</pattern>
        </encoder>
    </appender>
    <appender name="STDERR" class="ch.qos.logback.core.ConsoleAppender">
            <Target>System.err</Target>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <encoder> 
            <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%level] [%thread] %logger{10} [%file:%line] %msg%n</pattern> 
        </encoder> 
    </appender>
    <root level="INFO">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="STDERR" />
    </root>
</configuration>

37
आप ThresholdFilterइसके बजाय s का उपयोग करना चाहते हैं ।
मार्टिन श्रोडर

हाँ, जब आप सूचना, डिबग और ट्रेसआउट में लॉग इन होने के लिए ट्रेस करना चाहते हैं, लेकिन इसके बजाय केवल सूचना के स्तर को ही नजरअंदाज किया जाता है, लेकिन इसे नजरअंदाज किया जाता है, है ना?
डीन हिलर

यह डीबग और ट्रेस खाती है?
स्टीफन

@ MartinSchröder के उपयोग को देखते हुए logback.xml में <filter class="ch.qos.logback.classic.filter.ThresholdFilter">निर्दिष्ट करने की वास्तविक भूमिका क्या है <root level="INFO"> <appender-ref ref="STDOUT"/> <appender-ref ref="STDERR" /> </root>?
न्यूरोजेन

1
यह पता लगाया - <onMatch>और के <onMismatch>लिए परिभाषित नहीं कर रहे हैं ThresholdFilter। बस उन्हें हटा दें और यह इरादा के अनुसार काम करेगा।
चरनूर

46

केवल थ्रेशोल्डफिल्टर और लेवलफ़िल्टर्स के साथ कॉन्फ़िगरेशन पर आधारित समाधान , चीजों को समझने के लिए वास्तव में सरल रखने के लिए :

<configuration>
    <appender name="STDERR" class="ch.qos.logback.core.ConsoleAppender">
        <target>System.err</target>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
          <level>WARN</level>
        </filter>
        <encoder>
            <pattern>%date %level [%thread] %logger %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <target>System.out</target>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
          <level>DEBUG</level>
          <onMatch>ACCEPT</onMatch>
        </filter>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
          <level>INFO</level>
          <onMatch>ACCEPT</onMatch>
        </filter>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
          <level>TRACE</level>
          <onMatch>ACCEPT</onMatch>
        </filter>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
          <level>WARN</level>
          <onMatch>DENY</onMatch>
        </filter>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
          <level>ERROR</level>
          <onMatch>DENY</onMatch>
        </filter>
        <encoder>
            <pattern>%date %level [%thread] %logger %msg%n</pattern>
        </encoder>
    </appender>

    <root level="INFO">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="STDERR" />
    </root>
</configuration>

4
एक बिट क्रिया, लेकिन मुझे यह समाधान पसंद है क्योंकि यह बहुत सरल और पठनीय है।
गोंडी

@ गोंडी क्रिया क्यों? आप केवल उपयोग कर सकते हैं ThresoldFilter
1578 में एलेक्स78191

ThresoldFilterपांच का उपयोग करने के बजाय STDOUT का उपयोग क्यों न करें LevelFilter?
टोनारिमोची

@ Alex78191, @ tonarimochi जहां तक ​​मुझे याद है, थ्रेशोल्डफिल्टर का उपयोग निर्दिष्ट स्तर (WARN) से अधिक स्तर के साथ लॉग को स्वीकार करने या अस्वीकार करने के लिए किया जा सकता है, लेकिन इसके विपरीत नहीं। तो आप इसे WARN से कम लॉग फ़िल्टर करने के लिए उपयोग नहीं कर सकते। लेकिन अगर मैं गलत हूँ तो इस उत्तर को सुधारने या नया प्रस्तुत करने के लिए स्वतंत्र हूँ।
सेबास्टियन हेलबर्ट

31

ठीक है, यहाँ यह करने का मेरा पसंदीदा xml तरीका है। मैं ग्रहण संस्करण के लिए ऐसा करता हूं इसलिए कर सकता हूं

  • मुझे लॉग स्टेटमेंट पर ले जाने के लिए सामान पर क्लिक करें और
  • जानकारी देखें और नीचे काले रंग में और चेतावनी दें / लाल रंग में गंभीर

और किसी कारण से एसओ यह सब ठीक से नहीं दिखा रहा है, लेकिन सबसे ज्यादा लगता है ...

<configuration scan="true" scanPeriod="30 seconds">

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.core.filter.EvaluatorFilter">      
          <evaluator class="ch.qos.logback.classic.boolex.GEventEvaluator"> 
            <expression>
               e.level.toInt() &lt;= INFO.toInt()
            </expression>
          </evaluator>
          <OnMismatch>DENY</OnMismatch>
          <OnMatch>NEUTRAL</OnMatch>
        </filter>

        <encoder>
            <pattern>%date{ISO8601} %X{sessionid}-%X{user} %caller{1} %-4level: %message%n</pattern>
        </encoder>
    </appender>

    <appender name="STDERR" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> 
            <level>warn</level>
        </filter>

        <encoder>
            <pattern>%date{ISO8601} %X{sessionid}-%X{user} %caller{1} %-4level: %message%n</pattern>
        </encoder>
        <target>System.err</target>
    </appender>

    <root>
        <level value="INFO" />
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="STDERR"/>
    </root>
</configuration>

यह चेतावनी और त्रुटि से डीबग जानकारी को अलग करने के लिए सबसे अच्छा फ़िल्टरिंग समाधान है
खेरुद

logback.groovyइस लुक लाइन का संस्करण क्या होगा ?

15

सबसे सरल उपाय है ThresholdFilter, एपेंडर्स पर उपयोग करना:

    <appender name="..." class="...">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>

पूर्ण उदाहरण:

<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
        <encoder>
            <pattern>%d %-5level: %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="STDERR" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
        <target>System.err</target>
        <encoder>
            <pattern>%d %-5level: %msg%n</pattern>
        </encoder>
    </appender>

    <root>
        <appender-ref ref="STDOUT" />
        <appender-ref ref="STDERR" />
    </root>
</configuration>

अपडेट: जैसा कि माइक ने टिप्पणी में बताया है, ERROR स्तर वाले संदेश यहां STDOUT और STDERR दोनों में मुद्रित किए जाते हैं। हालांकि ओपी का इरादा क्या था, यह निश्चित नहीं है। यदि आप चाहते हैं कि यह नहीं है तो आप माइक के जवाब की कोशिश कर सकते हैं।


मैं लकड़हारा और जड़ का उपयोग कर रहा हूं। लकड़हारे के परिवादियों को निष्पादित किया जा रहा है लेकिन रूट में परिशिष्ट को नहीं बुलाया जा रहा है।
गंगाधर JANNU

गंगाधर, आपके बच्चे के लकड़हारे में "सत्य" = आपने सत्य को निर्धारित किया (आपने डिफ़ॉल्ट को ओवरराइड किया)।
X. Wo Satuk

1
धन्यवाद ... STDERR परिशिष्ट में <लक्ष्य> टैग को न भूलें! लेकिन इसके साथ एक समस्या यह भी है: फ़िल्टर स्तर से ऊपर का सभी आउटपुट मुद्रित होता है ... लेकिन stdout के साथ आप ERROR स्तर चाहते हैं (और ऊपर) मुद्रित नहीं होना चाहिए ... मेरा समाधान देखें जो इसे S Hébert के उत्तर के साथ जोड़ता है ...
माईक कृंतक

10

यह वह कॉन्फ़िगरेशन है जिसका मैं उपयोग करता हूं, जो ठीक काम करता है, यह XML + JaninoEventEvaluator पर आधारित है ( Classpath में Janino लाइब्रेरी को जोड़ने की आवश्यकता है )

<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>%date | [%-5level] in [%file:%line] - %msg %n</pattern>
    </encoder>
    <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
        <evaluator class="ch.qos.logback.classic.boolex.JaninoEventEvaluator">
            <expression>
                level &lt;= INFO
            </expression>
        </evaluator>
        <OnMismatch>DENY</OnMismatch>
        <OnMatch>NEUTRAL</OnMatch>
    </filter>
</appender>
<appender name="STDERR" class="ch.qos.logback.core.ConsoleAppender">
    <target>System.err</target>
    <encoder>
        <pattern>%date | [%-5level] in [%file:%line] - %msg %n</pattern>
    </encoder>
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
        <level>WARN</level>
    </filter>
</appender>

<root level="DEBUG">
    <appender-ref ref="STDOUT" />
    <appender-ref ref="STDERR" />
</root>
</configuration>  

8

मैं अपने लॉगबैक को कॉन्फ़िगर करने के लिए logback.groovy का उपयोग करता हूं लेकिन आप इसे xml कॉन्फिगर के साथ भी कर सकते हैं:

import static ch.qos.logback.classic.Level.*
import static ch.qos.logback.core.spi.FilterReply.DENY
import static ch.qos.logback.core.spi.FilterReply.NEUTRAL
import ch.qos.logback.classic.boolex.GEventEvaluator
import ch.qos.logback.classic.encoder.PatternLayoutEncoder
import ch.qos.logback.core.ConsoleAppender
import ch.qos.logback.core.filter.EvaluatorFilter

def patternExpression = "%date{ISO8601} [%5level] %msg%n"

appender("STDERR", ConsoleAppender) {
    filter(EvaluatorFilter) {
      evaluator(GEventEvaluator) {
        expression = 'e.level.toInt() >= WARN.toInt()'
      }
      onMatch = NEUTRAL
      onMismatch = DENY
    }
    encoder(PatternLayoutEncoder) {
      pattern = patternExpression
    }
    target = "System.err"
  }

appender("STDOUT", ConsoleAppender) {
    filter(EvaluatorFilter) {
      evaluator(GEventEvaluator) {
        expression = 'e.level.toInt() < WARN.toInt()'
      }
      onMismatch = DENY
      onMatch = NEUTRAL
    }
    encoder(PatternLayoutEncoder) {
      pattern = patternExpression
    }
    target = "System.out"
}

logger("org.hibernate.type", WARN)
logger("org.hibernate", WARN)
logger("org.springframework", WARN)

root(INFO,["STDERR","STDOUT"])

मुझे लगता है कि GEventEvaluator का उपयोग करना सरल है क्योंकि फ़िल्टर कक्षाएं बनाने की कोई आवश्यकता नहीं है।
मैं अपनी अंग्रेजी के लिए माफी माँगता हूँ!


4

इसे इस्तेमाल करे। तुम बस में निर्मित उपयोग कर सकते हैं ThresholdFilterऔर LevelFilter। प्रोग्रामिक रूप से अपने स्वयं के फ़िल्टर बनाने की आवश्यकता नहीं है। इस उदाहरण में WARN और ERROR का स्तर System.err में और बाकी System.out में लॉग किया गया है:

<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
    <!-- deny ERROR level -->
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <level>ERROR</level>
        <onMatch>DENY</onMatch>
    </filter>
    <!-- deny WARN level -->
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <level>WARN</level>
        <onMatch>DENY</onMatch>
    </filter>
    <target>System.out</target>
    <immediateFlush>true</immediateFlush>
    <encoder>
        <charset>utf-8</charset>
        <pattern>${msg_pattern}</pattern>
    </encoder>
</appender>

<appender name="stderr" class="ch.qos.logback.core.ConsoleAppender">
    <!-- deny all events with a level below WARN, that is INFO, DEBUG and TRACE -->
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
        <level>WARN</level>
    </filter>
    <target>System.err</target>
    <immediateFlush>true</immediateFlush>
    <encoder>
        <charset>utf-8</charset>
        <pattern>${msg_pattern}</pattern>
    </encoder>
</appender>   

<root level="WARN">
    <appender-ref ref="stderr"/>
</root>

<root level="TRACE">
    <appender-ref ref="stdout"/>
</root>


3

मैं इस उत्तर के लिए कोई श्रेय नहीं लेता, क्योंकि यह ऊपर दिए गए सर्वश्रेष्ठ दो उत्तरों का एक संयोजन है: X. Wo Satuk का और Sébastien Helbert का: ThresholdFilterसुंदर है, लेकिन आप इसे ऊपरी स्तर के साथ-साथ कॉन्फ़िगर नहीं कर सकते स्तर * कम है, लेकिन दो से तालमेल LevelFilters"अस्वीकार करें" सेट WARNऔर ERRORएक का इलाज काम करता है।

बहुत महत्वपूर्ण : <target>System.err</target>STDERR परिशिष्ट में टैग को न भूलें : इसकी चूक से मुझे कुछ मिनटों के लिए निराशा हुई थी।

<configuration>
    <timestamp key="byDay" datePattern="yyyyMMdd'T'HHmmss" />
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>WARN</level>
            <onMatch>DENY</onMatch>
        </filter>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>DENY</onMatch>
        </filter>
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36}.%M\(%line\)
                - %msg%n
            </pattern>
        </encoder>
    </appender>

    <appender name="STDERR" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>WARN</level>
        </filter>
        <target>System.err</target>
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36}.%M\(%line\)
                - %msg%n
            </pattern>
        </encoder>
    </appender>

    <root level="debug">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="STDERR" />
    </root>
</configuration>

* यह एपीआईdecide में एक विधि है, लेकिन मैं इस संदर्भ में आप इसे कैसे उपयोग करेंगे कोई सुराग नहीं है।


यह वास्तव में थ्रेशोल्डफिल्टर और लेवलफ़िल्टर के संयोजन का सबसे अच्छा समाधान है!
जिस्टलिच

<लक्ष्य> System.err </ target> किसके लिए है?
सिमरन कौर

1

कोई प्रोग्रामिंग की जरूरत है। विन्यास आपके जीवन को आसान बनाता है।

नीचे कॉन्फ़िगरेशन है जो लॉग के विभिन्न स्तरों को अलग-अलग फ़ाइलों में लॉग करता है

<property name="DEV_HOME" value="./logs" />

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
        <level>INFO</level>
    </filter>
    <layout class="ch.qos.logback.classic.PatternLayout">
        <Pattern>
            %d{yyyy-MM-dd HH:mm:ss} %-5level - %msg%n
        </Pattern>
    </layout>
</appender>

<appender name="FILE-ERROR"
    class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${DEV_HOME}/app-error.log</file>
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
        <Pattern>
            %d{yyyy-MM-dd HH:mm:ss} %-5level - %msg%n
        </Pattern>
    </encoder>

    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <!-- rollover daily -->
        <fileNamePattern>${DEV_HOME}/archived/app-error.%d{yyyy-MM-dd}.%i.log
        </fileNamePattern>
        <timeBasedFileNamingAndTriggeringPolicy
            class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
            <maxFileSize>10MB</maxFileSize>
        </timeBasedFileNamingAndTriggeringPolicy>
    </rollingPolicy>

    <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <level>ERROR</level>
        <!--output messages of exact level only -->
        <onMatch>ACCEPT</onMatch>
        <onMismatch>DENY</onMismatch>
    </filter>
</appender>
<appender name="FILE-INFO"
    class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${DEV_HOME}/app-info.log</file>
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
        <Pattern>
            %d{yyyy-MM-dd HH:mm:ss} %-5level - %msg%n
        </Pattern>
    </encoder>

    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <!-- rollover daily -->
        <fileNamePattern>${DEV_HOME}/archived/app-info.%d{yyyy-MM-dd}.%i.log
        </fileNamePattern>
        <timeBasedFileNamingAndTriggeringPolicy
            class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
            <maxFileSize>10MB</maxFileSize>
        </timeBasedFileNamingAndTriggeringPolicy>
    </rollingPolicy>


    <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <level>INFO</level>
        <!--output messages of exact level only -->
        <onMatch>ACCEPT</onMatch>
        <onMismatch>DENY</onMismatch>
    </filter>
</appender>


<appender name="FILE-DEBUG"
    class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${DEV_HOME}/app-debug.log</file>
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
        <Pattern>
            %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
        </Pattern>
    </encoder>

    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <!-- rollover daily -->
        <fileNamePattern>${DEV_HOME}/archived/app-debug.%d{yyyy-MM-dd}.%i.log
        </fileNamePattern>
        <timeBasedFileNamingAndTriggeringPolicy
            class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
            <maxFileSize>10MB</maxFileSize>
        </timeBasedFileNamingAndTriggeringPolicy>
    </rollingPolicy>

    <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <level>DEBUG</level>
        <!--output messages of exact level only -->
        <onMatch>ACCEPT</onMatch>
        <onMismatch>DENY</onMismatch>
    </filter>
</appender>

<appender name="FILE-ALL"
    class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${DEV_HOME}/app.log</file>
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
        <Pattern>
            %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
        </Pattern>
    </encoder>

    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <!-- rollover daily -->
        <fileNamePattern>${DEV_HOME}/archived/app.%d{yyyy-MM-dd}.%i.log
        </fileNamePattern>
        <timeBasedFileNamingAndTriggeringPolicy
            class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
            <maxFileSize>10MB</maxFileSize>
        </timeBasedFileNamingAndTriggeringPolicy>
    </rollingPolicy>
</appender>

<logger name="com.abc.xyz" level="DEBUG" additivity="true">
    <appender-ref ref="FILE-DEBUG" />
    <appender-ref ref="FILE-INFO" />
    <appender-ref ref="FILE-ERROR" />
    <appender-ref ref="FILE-ALL" />
</logger>

<root level="INFO">
    <appender-ref ref="STDOUT" />
</root>


0
<configuration scan="true" scanPeriod="60 seconds">
 <appender name="A1" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${storm.log.dir}/${logfile.name}</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
      <fileNamePattern>${storm.log.dir}/${logfile.name}.%i</fileNamePattern>
      <minIndex>1</minIndex>
      <maxIndex>9</maxIndex>
    </rollingPolicy>

    <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
      <maxFileSize>100MB</maxFileSize>
    </triggeringPolicy>

    <encoder>
      <pattern>%d{yyyy-MM-dd'T'HH:mm:ss.SSSZZ} %c{1} [%p] %m%n</pattern>
    </encoder>
 </appender>

 <appender name="ACCESS" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${storm.log.dir}/access.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
      <fileNamePattern>${storm.log.dir}/access.log.%i</fileNamePattern>
      <minIndex>1</minIndex>
      <maxIndex>9</maxIndex>
    </rollingPolicy>

    <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
      <maxFileSize>100MB</maxFileSize>
    </triggeringPolicy>

    <encoder>
      <pattern>%d{yyyy-MM-dd'T'HH:mm:ss.SSSZZ} %c{1} [%p] %m%n</pattern>
    </encoder>
  </appender>

  <appender name="METRICS" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${storm.log.dir}/metrics.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
      <fileNamePattern>${storm.log.dir}/logs/metrics.log.%i</fileNamePattern>
      <minIndex>1</minIndex>
      <maxIndex>9</maxIndex>
    </rollingPolicy>

    <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
      <maxFileSize>2MB</maxFileSize>
    </triggeringPolicy>

    <encoder>
      <pattern>%d %-8r %m%n</pattern>
    </encoder>
  </appender>

  <root level="INFO">
    <appender-ref ref="A1"/>
  </root>

  <logger name="backtype.storm.security.auth.authorizer" additivity="false">
    <level value="INFO" />
    <appender-ref ref="ACCESS" />
  </logger>

  <logger name="backtype.storm.metric.LoggingMetricsConsumer" additivity="false" >
    <level value="INFO"/>
    <appender-ref ref="METRICS"/>
  </logger>

</configuration>

So here is the logback file in which I am not printing backtype.storm.metric.LoggingMetricsConsumer info level if i say additivity = "true" then for for all classes in backtype.* this rule will be applied

0

स्तर "INFO" के रंगीन संदेशों को आउटपुट करने के लिए या कंसोल के लिए उच्च स्तर का उदाहरण और फ़ाइल के लिए "WARN" या उच्चतर के संदेश ।

आपकी logback.xml फ़ाइल:

<?xml version="1.0" encoding="UTF-8"?>

<configuration>
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>

            <!--output messages of exact level only-->
            <!--<onMatch>ACCEPT</onMatch>-->
            <!--<onMismatch>DENY</onMismatch>-->
        </filter>
        <encoder>
            <pattern>%d{yyyy-MMM-dd HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{15}) - %msg %n
            </pattern>
        </encoder>
    </appender>

    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>myfile.log</file>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>WARN</level>
        </filter>
        <append>true</append>
        <encoder>
            <pattern>%d{yyyy-MMM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{15} - %msg%n</pattern>
        </encoder>
    </appender>

    <root level="INFO">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="FILE"/>
    </root>
</configuration>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.