हर लॉग की शुरुआत में लॉगबैक को अपनी स्थिति को आउटपुट करने से कैसे रोका जाए?


145

यह एक लापरवाही त्रुटि की तरह लगता है, लेकिन मैं कारण खोजने के लिए प्रतीत नहीं कर सकते। लॉगबैक / slf4j (सबसे हाल का संस्करण slf4j-api-1.6.1, लॉगबैक कोर / क्लासिक 0.9.24) के साथ लॉगिंग। परीक्षण के लिए सबसे सरल लॉग कॉन्फ़िगरेशन है:

<configuration>
 <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
  <layout class="ch.qos.logback.classic.PatternLayout">
   <!-- DONT USE THIS FORMATTER FOR LIVE LOGGING THE %L LINE NUMBER OUTPUTTER IS SLOW -->
   <pattern>%le %-1r [%c{1}:%L] %m%n</pattern>
  </layout>
 </appender>
 <root level="DEBUG">
  <appender-ref ref="stdout" />
 </root>
</configuration>

हर लॉग सेटअप लॉगबैक की आंतरिक स्थिति लाइनों से शुरू होता है:

11:21:27,825 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy]
11:21:27,826 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback-test.xml] at [file:.../logback-test.xml]
11:21:28,116 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - debug attribute not set
11:21:28,124 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender]
11:21:28,129 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [stdout]
11:21:28,180 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Pushing component [layout] on top of the object stack.
11:21:28,206 |-WARN in ch.qos.logback.core.ConsoleAppender[stdout] - This appender no longer admits a layout as a sub-component, set an encoder instead.
11:21:28,206 |-WARN in ch.qos.logback.core.ConsoleAppender[stdout] - To ensure compatibility, wrapping your layout in LayoutWrappingEncoder.
11:21:28,206 |-WARN in ch.qos.logback.core.ConsoleAppender[stdout] - See also http://logback.qos.ch/codes.html#layoutInsteadOfEncoder for details
11:21:28,207 |-INFO in ch.qos.logback.classic.joran.action.RootLoggerAction - Setting level of ROOT logger to DEBUG
11:21:28,207 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [stdout] to Logger[ROOT]

जो, डॉक्स के अनुसार, डिफ़ॉल्ट के लिए प्रारूप लॉगबैक का उपयोग करता है। यह तब विन्यास पढ़ना (जो एक अलग प्रारूप आउटपुट के लिए सेट है) को पूरा करता है और ठीक से स्वरूपित आउटपुट के साथ जारी रहता है। वहाँ एक config पैरामीटर है <configuration debug="false">जो इस को प्रभावित नहीं करता है।

किसी को पता है कि यह कैसे बंद करें?


% L की गणना में लॉगबैक के हाल के संस्करण बहुत तेज़ हैं।
थोरबजोरन रावन एंडरसन

@ ThorbjørnRavnAndersen डॉक्स का कहना है कि "एल / लाइन: लाइन नंबर की जानकारी उत्पन्न करना विशेष रूप से तेज नहीं है। इस प्रकार, इसके उपयोग से बचा जाना चाहिए जब तक कि निष्पादन की गति एक मुद्दा नहीं है।" FWIW: logback.qos.ch/manual/layouts.html (तो शायद यह तेज़ है, लेकिन अभी भी सुपर फास्ट या कुछ और नहीं है ...)
rogerdpack

@rogerdpack हाँ। यह एक अपवाद के ढेर ट्रेस का विश्लेषण करके पाया जाता है। वह तेज हो गया है।
थोरबजर्न रावन एंडरसन

जवाबों:


249

यदि आप तत्व का debugगुण निर्धारित करते हैं , तो आपको कंसोल की सभी स्थिति की जानकारी मिल जाएगी। यदि यह आपकी समस्या है, तो इसे गलत पर सेट करें या इसे हटा दें।configurationtrue

यदि आपके पास स्तर WARNया ऊपर की कोई कॉन्फ़िगरेशन समस्या है , तो आपको कंसोल में लॉग की गई सभी स्थिति की जानकारी भी मिल जाएगी (स्तर के संदेश सहित INFO)। इस समस्या का सबसे अच्छा समाधान समस्या को ठीक करना है (आपके मामले में <layout>तत्व को तत्व के साथ बदलें <encoder>)।

यदि आप किसी कारण से समस्या को ठीक नहीं कर सकते हैं, लेकिन कंसोल से स्थिति-जानकारी को निकालना चाहते हैं, तो आप इसके बजाय किसी विकल्प को कॉन्फ़िगर कर सकते हैं StatusListenerNopStatusListenerस्थिति-जानकारी को पूरी तरह से हटाने के लिए उपयोग करें :

<configuration>
  <statusListener class="ch.qos.logback.core.status.NopStatusListener" />
  <!-- etc -->
</configuration>

9
यह सही उत्तर है, इसे और अधिक उत्कीर्ण किया जाना चाहिए, धन्यवाद। (लॉगबैक 1.0.11)
जैकब कुल्हान

3
यह काम किया। मैं पूरी तरह से स्पष्ट नहीं था कि INFOलॉग संदेश भी गायब हो जाएंगे, लेकिन वास्तव में वे करते हैं। मुझे पता है कि उत्तर यह कहता है, लेकिन किसी कारण से यह मेरे लिए स्पष्ट नहीं था। ओह-सो-क्लीयर होने के लिए: एन्कोडर / लेआउट समस्या को ठीक करें और न केवल चेतावनी संदेश चले जाएंगे, बल्कि जानकारी संदेश भी चले जाएंगे, भले ही वे समस्या से संबंधित हों।
जेसन

3
डिबग विशेषता के साथ काम नहीं किया, लेकिन स्थिति श्रोता के साथ निर्दोष काम किया।
अमीबा स्पूगनोसा

साभार - जरूरी स्टेटस श्रोता
यहेजकेल विक्टर

2
इस दृष्टिकोण का उपयोग करते हुए, यह काम करने के लिए प्रकट होता है, लेकिन यह इस तथ्य को छिपाता है कि आपकी फ़ाइल में कॉन्फ़िगरेशन त्रुटि है। असली समस्या WARN लॉग है, इन मुद्दों को कॉन्फ़िगर में तय किया जाना चाहिए, फिर सभी लॉग इंक। जानकारी देते चले जाते हैं।
टेकनोपुल

45

के रूप में किए गए दस्तावेज़ों में वर्णित है, अगर चेतावनियां या त्रुटियां विन्यास फाइल को पार्स के दौरान हो, logback स्वचालित रूप से स्थिति डेटा कंसोल पर प्रिंट होगा।

का पालन करें http://logback.qos.ch/codes.html#layoutInsteadOfEncoder लिंक इसकी चेतावनी संदेश में logback ने उल्लेख किया अर्थात्। एक बार जब आप उसमें बताए गए चरणों का पालन कर लेंगे, अर्थात यदि आप <लेआउट> तत्व को <एनकोडर> से बदल देते हैं, तो लॉगबैक कंसोल पर संदेश प्रिंट करना बंद कर देगा।


4
सही की तरह, हालांकि आपने मुझे सही दिशा में इंगित किया। मैं उस एनकोडर सिंटैक्स को बिना प्रभाव के बदल देता, हालाँकि यह पता चलता है कि लॉगबैक.एक्सएमएल में एक और लाइन को हटाने से चेतावनी पैदा हो रही थी। इसके बारे में भ्रामक बात यह है कि आउटपुट आउटपुट निर्णय लेने से पहले लगता है कि यह वास्तव में आपकी लॉगबैक फ़ाइल को पार्स करता है, (1> संसाधन नहीं मिल सकता है [logback.groovy], 2> पाया गया संसाधन [लॉगबैक-टेस्ट। Xml])। पार्स होने से पहले स्थिति संदेशों को छिपाने के लिए लॉगबैक-टेस्ट में एक फिक्स के लिए यह बहुत भ्रामक है। लेकिन सूचक के लिए धन्यवाद।
स्टीव बी।

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

6
FWIW, मैं भी यह काफी भ्रमित व्यवहार लगता है। INFO स्तर के संदेशों की व्याख्या ERROR संदेशों को छिपाने का एक बहुत अच्छा काम करती है जो मुझे बताती है कि मुझे वास्तव में क्या ठीक करने की आवश्यकता है। एक DTD की कमी, या कॉन्फ़िगरेशन फ़ाइल के सिंटैक्स के किसी भी अन्य विनिर्देश, ने मैसेज को स्पॉट करने के बाद भी इसे डीबग करने के लिए काफी परीक्षण किया।
टॉम एंडरसन

4
@ कैकी: मैंने आखिरकार यह पता लगा लिया: इन संदेशों को ट्रिगर करने का दूसरा तरीका तत्व debug="true"में विशेषता configurationहै logback.xml। कृपया इस छेद में गिरने वाले अन्य लोगों के लाभ के लिए इसका उल्लेख करें!
कार्ल स्मोत्रिकेज़

6
शायद पहले INFO के बयान से पहले एक 'चेतावनी का पता चला होना चाहिए, सभी पिछले स्थिति की जानकारी outputting। इस संदेश को रोकने के लिए, अपनी चेतावनी / त्रुटियों को ठीक करें '
डेविड रूसेल

7

Ceki उत्तर सही है:

(...) यदि कॉन्फ़िगरेशन फ़ाइल के पार्सिंग के दौरान चेतावनी या त्रुटियां होती हैं, तो लॉगबैक स्वचालित रूप से कंसोल पर स्थिति डेटा प्रिंट करेगा।

एक बार जब आप इसे सही कर लेते हैं, तो आपके लॉग की पहली पंक्तियों में अब कोई प्रदूषण नहीं होगा।

मार्च 2015 तक, लॉगबैक 1.1.2 में , आपको <encoder>उप-घटक का उपयोग करने की आवश्यकता है - <layout>अब पदावनत किया गया है और यदि इसका उपयोग किया जाता है, तो त्रुटि संदेश दिखाई देंगे। आप इसे नियंत्रित नहीं कर सकते, यह लॉगबैक डिफ़ॉल्ट व्यवहार है।

कुछ आंतरिक कक्षाओं का भी नाम बदल दिया गया है, और यहां तक ​​कि उनके मैनुअल पेज के उदाहरण भी पुराने हैं!

यहां उनके त्रुटियां कोड सहायता पृष्ठ से कोड स्निपेट है , जिसमें लकड़हारा को कॉन्फ़िगर करने का सही तरीका है। यह पूरी तरह से मेरी परियोजना में मुद्दा तय किया। http://logback.qos.ch/codes.html#layoutInsteadOfEncoder

<appender name="FILE" class="ch.qos.logback.core.FileAppender">
  <file>testFile.log</file>
  ...
  <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
    <pattern>%msg%n</pattern>
  </encoder>
</appender>

4

मुझे एहसास हुआ कि स्टीव को ठीक लगा लेकिन उसने इसका उल्लेख धागे पर नहीं किया। यदि किसी अन्य व्यक्ति ने यहां एक ही मुद्दे को मारा है तो वह ठीक है।

"<लेआउट>" तत्वों को "<एनकोडर> .. </ एनकोडर>" से बदलें

अपराधी है: <लेआउट वर्ग = "ch.qos.logback.classic.PatternLayout">


1
यदि आप उन संदेशों को पूरी तरह से हटाना चाहते हैं, तो NopStatusListener का उपयोग करें जैसा कि रासमस ने वर्णित किया है। एनकोडर बनाम लेआउट दृष्टिकोण उदाहरण के लिए 'logback.groovy not found' जैसे संदेशों को दबाते नहीं हैं। मैं लॉगबैक-क्लासिक 1.1.3 (मार्च 2015) का उपयोग कर रहा हूं
क्रिस्टियन बोटिजा

3

स्वयं उसी समस्या से जूझते हुए, यानी शुरुआत में लॉग इन लाइनों का एक गुच्छा था, जो मेरे कोड से संबंधित नहीं थे। यहां बताया गया है कि मैंने इसे कैसे तय किया।

<configuration debug="false">

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <!-- <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level 
        %logger{36} - %msg%n</pattern> </encoder> -->
    <encoder>
        <pattern>%d{HH:mm:ss.SSS} %-5level %logger{10} - %msg%n</pattern>
    </encoder>
</appender>

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

<logger name="fun.n.games" level="DEBUG" />

यह pom.xml में निम्नलिखित प्रविष्टि के साथ चल रहा है

        <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.2.3</version>
    </dependency>

2

यह 0.9.29 में निश्चित प्रतीत होता है। बस कई परीक्षण किए। अब कोई ज़ोरान इंफो नहीं। मुझे लगता है कि यह फिक्सिंग कमेटी है।


2

मैं एक ही समस्या मैं इस लाइन जोड़ा गया था

        <!-- Stop output INFO at start -->
        <statusListener class="ch.qos.logback.core.status.NopStatusListener" />

लॉगबैक में और यह सफलता से काम किया


यह काम करता है, हालांकि यह ERROR संदेशों के आउटपुट को भी रोकता है - जब गंभीर लॉगबैक कॉन्फ़िगरेशन समस्या के कारण कोई आउटपुट उत्पन्न नहीं होता है।
माननीय

0

मैंने सब कुछ करने की कोशिश की है और मेरे लिए कुछ भी काम नहीं किया। मेरी समस्या मेरे classpath में कई logback.xml फ़ाइलों के कारण थी। मल्टी मॉड्यूलर प्रोजेक्ट्स में यह सामान्य मामला है। जब classpath में केवल एक logback.xml फ़ाइल होती है, तो कोई अस्पष्टता नहीं होती है और समस्या हल हो जाती है।


इसने आपको क्या आउटपुट दिया?
रेजरडैक

0

का उपयोग करना logback.groovy:statusListener(NopStatusListener) (में src/test/resources/logback.groovy) काम करता है।

(वैध उपयोग का मामला उदाहरण के लिए, यदि ग्रहण में ANT के साथ काम कर रहा है, तो लॉगबैक लॉगिंग, ग्रूवी क्लासेस और यूनिट टेस्ट का उपयोग करें जहाँ यूनिट टेस्ट लेता है src/test/resources/logback.groovy, लेकिन आपको src/main/resources/logback.groovy(या समान) को बाहर नहीं कर सकता है (यदि ANT की सहपाठी का उपयोग करने के लिए कहा जाता है) परियोजनाओं वर्गपथ))


0

मैं स्वयं लॉगबैक लॉग को बंद करने के लिए स्थिति श्रोता का उपयोग करना पसंद करता हूं:

<configuration>
  <statusListener class="ch.qos.logback.core.status.NopStatusListener" />
  ...
</configuration>

लेकिन जैसा कि उल्लेख किया गया था NopStatusListener भी चेतावनी और त्रुटियों को दिखाने से रोकता है। तो आप अपने कस्टम स्टेटस श्रोता को लिख सकते हैं और इसके लिए लॉग स्तर को मैन्युअल रूप से बदल सकते हैं:

package com.your.package;

import ch.qos.logback.core.status.OnConsoleStatusListener;
import ch.qos.logback.core.status.Status;

import java.util.List;

public class PrintOnlyWarningLogbackStatusListener extends OnConsoleStatusListener {

    private static final int LOG_LEVEL = Status.WARN;

    @Override
    public void addStatusEvent(Status status) {
        if (status.getLevel() == LOG_LEVEL) {
            super.addStatusEvent(status);
        }
    }

    @Override
    public void start() {
        final List<Status> statuses = context.getStatusManager().getCopyOfStatusList();
        for (Status status : statuses) {
            if (status.getLevel() == LOG_LEVEL) {
                super.start();
            }
        }
    }

}    

फिर अपने logback.xml फ़ाइल में इसका उपयोग करें:

<configuration>
  <statusListener class="com.your.package.PrintOnlyWarningLogbackStatusListener" />
  ...
</configuration>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.