Slf4j-simple को कैसे कॉन्फ़िगर करें


166

एपीआई 1.7 और कार्यान्वयन के रूप में slf4j- सरल। मैं अभी नहीं मिला कि इस संयोजन के साथ लॉगिंग स्तर को कैसे कॉन्फ़िगर किया जाए।

क्या कोई मदद कर सकता है?


डिफ़ॉल्ट जानकारी को stdout, FWIW: Saltnlight5.blogspot.com/2013/08/…
rogerdpack

जवाबों:


218

यह या तो सिस्टम संपत्ति के माध्यम से है

-Dorg.slf4j.simpleLogger.defaultLogLevel=debug

या simplelogger.propertiesक्लासपाथ पर फ़ाइल

देख http://www.slf4j.org/api/org/slf4j/impl/SimpleLogger.html जानकारी के लिए


धन्यवाद, मैंने System.properties में "त्रुटि" के लिए "org.slf4j.simpleLogger.defaultLogLevel" सेट किया, हालांकि slf4j अभी भी INFO स्तर के संदेश लॉग करता है। कोई उपाय? बीटीडब्लू, मुझे कहां जाना चाहिए?
जिलिन लुओ

2
org.slf4j.simplelogger.defaultlog के बजाय org.slf4j.simpleLogger.defaultLogLevel आज़माएं। फ़ाइल क्लासपाथ पर होनी चाहिए, डिफॉल्ट पैकेज
एवगेनी डोरोफेव

2
वास्तव में यह ( defaultLogLevel) defaultlogकाम करता है। सिर्फ मैंने पाया कि मैं एक गलत फ़ोल्डर में प्रोग्राम को संशोधित कर रहा था ;-) और काम नहीं करता। तो आप शायद अपने उत्तर को संपादित करना चाहते हैं, हालांकि मैंने इसे स्वीकार कर लिया है
जेलिन लुओ

11
बस एक नोट: वास्तव में दोनों उत्तर अच्छे हैं, जो आपके द्वारा उपयोग किए जा रहे SimpleLogger के संस्करण पर निर्भर करता है। उदाहरण के लिए, DefaultLogLevel 1.7.5 के लिए काम करता है, लेकिन डिफ़ॉल्ट लॉग 1.6.6 के लिए काम करता है। मुझे पता चला जब मेरी परियोजना लॉगिंग को कॉन्फ़िगर करने और इस पोस्ट पर आ रही थी
केन शिह

112

यह एक नमूना है simplelogger.propertiesजिसे आप क्लासपाथ पर रख सकते हैं (उन गुणों को अनसुना करें जो आप उपयोग करना चाहते हैं):

# SLF4J's SimpleLogger configuration file
# Simple implementation of Logger that sends all enabled log messages, for all defined loggers, to System.err.

# Default logging detail level for all instances of SimpleLogger.
# Must be one of ("trace", "debug", "info", "warn", or "error").
# If not specified, defaults to "info".
#org.slf4j.simpleLogger.defaultLogLevel=info

# Logging detail level for a SimpleLogger instance named "xxxxx".
# Must be one of ("trace", "debug", "info", "warn", or "error").
# If not specified, the default logging detail level is used.
#org.slf4j.simpleLogger.log.xxxxx=

# Set to true if you want the current date and time to be included in output messages.
# Default is false, and will output the number of milliseconds elapsed since startup.
#org.slf4j.simpleLogger.showDateTime=false

# The date and time format to be used in the output messages.
# The pattern describing the date and time format is the same that is used in java.text.SimpleDateFormat.
# If the format is not specified or is invalid, the default format is used.
# The default format is yyyy-MM-dd HH:mm:ss:SSS Z.
#org.slf4j.simpleLogger.dateTimeFormat=yyyy-MM-dd HH:mm:ss:SSS Z

# Set to true if you want to output the current thread name.
# Defaults to true.
#org.slf4j.simpleLogger.showThreadName=true

# Set to true if you want the Logger instance name to be included in output messages.
# Defaults to true.
#org.slf4j.simpleLogger.showLogName=true

# Set to true if you want the last component of the name to be included in output messages.
# Defaults to false.
#org.slf4j.simpleLogger.showShortLogName=false

1
@RobertHunt इस लॉग को फाइल में कैसे सेव करें?
देवव्रत

6
@ देवव्रत संपत्ति जोड़ते हैं org.slf4j.simpleLogger.logFile- आउटपुट लक्ष्य जो किसी फ़ाइल या विशेष मान "System.out" और "System.err" के लिए पथ हो सकता है। डिफ़ॉल्ट "System.err" है। Slf4j.org/api/org/slf4j/impl/SimpleLogger.html
रॉबर्ट हंट

क्या कई मूल्य रखना संभव है? यदि हाँ तो कैसे? जैसे मुझे org.slf4j.simpleLogger.logFile = test.log, System.err चाहिए?
LOLWTFasdasd asdad 10

1
@LOLWTFasdasdasdad दुर्भाग्य से नहीं, यह केवल एकल लक्ष्य का समर्थन करता है, या तो System.out, System.err या फ़ाइल का पथ। यह सरल होने के लिए डिज़ाइन किया गया है, यदि आपको अधिक उन्नत सुविधाएँ चाहिए, तो आपको Log4J या Logback जैसे पूर्ण लॉगिंग कार्यान्वयन पर विचार करना चाहिए।
रॉबर्ट हंट

75

आप सिस्टम प्रॉपर्टी सेट करके प्रोग्राम को बदल सकते हैं:

public class App {

    public static void main(String[] args) {

        System.setProperty(org.slf4j.impl.SimpleLogger.DEFAULT_LOG_LEVEL_KEY, "TRACE");

        final org.slf4j.Logger log = LoggerFactory.getLogger(App.class);

        log.trace("trace");
        log.debug("debug");
        log.info("info");
        log.warn("warning");
        log.error("error");

    }
}

लॉग स्तर ERROR> WARN> INFO> DEBUG> TRACE हैं।

कृपया ध्यान दें कि एक बार लकड़हारा बनने के बाद लॉग स्तर को बदला नहीं जा सकता है। यदि आपको लॉगिंग स्तर को गतिशील रूप से बदलने की आवश्यकता है तो आप SLF4J के साथ log4j का उपयोग करना चाह सकते हैं ।


3
"कृपया ध्यान दें कि एक बार लॉग बनाने के बाद लॉग स्तर को बदला नहीं जा सकता है।" - यह वास्तव में कहां निर्दिष्ट है?
ksl

2
ksl, org.slf4j.impl.SimpleLogger में। जब पहला लकड़हारा बनाया जाता है, init () विधि चलाई जाती है और यह सिस्टम गुणों से डिफ़ॉल्ट लॉगिंग स्तर प्राप्त करता है। यह किसी भी बिंदु पर ताज़ा नहीं है। इसके अलावा, org.slf4j.impl.SimpleLoggerFactory केवल एक बार वर्ग के लिए एक लकड़हारा बनाता है, इस प्रकार, एक ही लकड़हारा हमेशा दिए गए वर्ग (या नाम) के लिए वापस आ जाता है। हालांकि, विभिन्न स्तरों के साथ लॉगर होना संभव है। जब आप लॉगिंग स्तर को बदलना चाहते हैं तो संभव हो सकता है कि आप इन विभिन्न स्तर के लॉगर्स को अपने "लॉग" वेरिएबल में असाइन करें। यह बहुत साफ समाधान नहीं है, लेकिन काम करना चाहिए।
एमीलिपा

@Eemuli org.slf4j.impl.SimpleLoggerक्या आपका मतलब डॉक के बजाय वास्तविक स्रोत कोड है?
ksl

क्या यह भी सच है कि LOG_FILE_KEYलकड़हारा बनने के बाद संपत्ति को बदला नहीं जा सकता है?
ksl

1
हां, मेरा मतलब वास्तविक स्रोत कोड है। मैं LOG_FILE_KEY के बारे में निश्चित नहीं हूं।
एमीलिपा

4

मैंने देखा कि एमुली ने कहा कि आप लॉग स्तर को उनके बनाए जाने के बाद नहीं बदल सकते - और जबकि यह डिजाइन हो सकता है, यह पूरी तरह सच नहीं है।

मैं एक ऐसी स्थिति में भाग गया, जहां मैं एक लाइब्रेरी का उपयोग कर रहा था, जो कि slf4j में लॉग इन किया था - और मैं लाइब्रेरी का उपयोग करते हुए एक मावेन मोजो प्लगइन लिख रहा था।

Maven slf4j SimpleLogger के एक (हैक किए गए) संस्करण का उपयोग करता है, और मैं अपने प्लगइन कोड को लॉग 4j जैसी किसी चीज के लिए इसके लॉगआउट को पुन: आउट करने में असमर्थ था, जिसे मैं नियंत्रित कर सकता था।

और मैं मावेन लॉगिंग कॉन्फिग को नहीं बदल सकता।

इसलिए, कुछ शोर जानकारी संदेशों को शांत करने के लिए, मैंने पाया कि मैं इस तरह के प्रतिबिंब का उपयोग कर सकता हूं, रनटाइम पर सिंपलोगर के साथ फ्यूज़ करने के लिए।

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.spi.LocationAwareLogger;
    try
    {
        Logger l = LoggerFactory.getLogger("full.classname.of.noisy.logger");  //This is actually a MavenSimpleLogger, but due to various classloader issues, can't work with the directly.
        Field f = l.getClass().getSuperclass().getDeclaredField("currentLogLevel");
        f.setAccessible(true);
        f.set(l, LocationAwareLogger.WARN_INT);
    }
    catch (Exception e)
    {
        getLog().warn("Failed to reset the log level of " + loggerName + ", it will continue being noisy.", e);
    }

बेशक, ध्यान दें, यह एक बहुत ही स्थिर / विश्वसनीय समाधान नहीं है ... क्योंकि यह अगली बार मावेन लोगों को अपने लकड़हारे को बदल देगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.