2010-04-28 31 views
16

मैं एक परियोजना में पहली बार log4j का उपयोग कर रहा हूँ। एक साथी प्रोग्रामर ने मुझे बताया कि System.out.println का उपयोग करना एक खराब शैली माना जाता है और log4j आजकल लॉगिंग मामलों के लिए मानक की तरह कुछ है।log4j बनाम System.out.println - लॉगर फायदे?

हम JUnit परीक्षण के बहुत सारे हैं - System.out सामान पता चला है परीक्षण करने के लिए कठिन हो सकता है।

इसलिए मैं एक कंसोल नियंत्रक वर्ग के लिए log4j का उपयोग शुरू किया, कि सिर्फ कमांड लाइन पैरामीटर से निपटने है।

logger.debug("String"); 

का उत्पादन:

// log4j logger config 
org.apache.log4j.BasicConfigurator.configure(); 
Logger logger = LoggerFactory.getLogger(Console.class); 
Category cat = Category.getRoot(); 

काम करने के लिए लगता है

1 [main] DEBUG project.prototype.controller.Console - String 

मैं इस बारे में दो पास प्रश्न: चाहिए इस लकड़हारा का उपयोग कर मेरी बुनियादी समझ से

  1. समर्थक टाइमस्टैम्प के साथ लॉगफाइल लिखने के लिए मुझे आरामदायक विकल्प बताएं - कंसोल को स्पैम करने की बजाय - अगर लॉगर पर डीबग मोड सक्षम है?
  2. System.out.println परीक्षण करने के लिए कठिन क्यों है? मैंने स्टैक ओवरफ्लो की खोज की और testing recipe पाया। तो मुझे आश्चर्य है कि लॉग 4j का उपयोग करके मुझे वास्तव में किस तरह का लाभ मिलता है।
+0

लॉगर्स बेहद अतिरंजित हैं। 'System.out' और' System.err' आपको लॉगिंग फ्रेमवर्क के नरक के 20% के साथ कार्यक्षमता का 80% देता है। कॉमन्स लॉगिंग के संबंध में –

उत्तर

21

लकड़हारा लॉग इन संदेशों और आउटपुट के लिए अलग सिंक उपयोग करने की क्षमता के महत्व के विभिन्न स्तरों को परिभाषित करने की क्षमता देता है - कंसोल, एक फ़ाइल, आदि

भी सक्रिय या निष्क्रिय करने के लिए केवल आसान है लॉगर का उपयोग करते समय कुछ प्रकार का संदेश - उदाहरण के लिए आप उत्पादन में प्रत्येक डीबग संदेश नहीं देखना चाहते हैं।

मुझे लगता है कि वालों का उपयोग कर इकाई परीक्षण में कोई महत्वपूर्ण लाभ प्रदान करता है नहीं लगता है, लेकिन मैं यह भी वहाँ वैसे भी पसंद करेंगे। यूनिट परीक्षणों में आमतौर पर आवेषण मेरी प्राथमिक चिंता होती है।

बीटीडब्ल्यू आपको वास्तव में Commons Logging या SLF4J जैसे लॉग फ्रेमवर्क मुखौटा के रूप में उपयोग करने पर विचार करना चाहिए - यह आपके कोड को एक विशिष्ट लॉगिंग फ्रेमवर्क में बांधने की खराब शैली है। सामान्य लॉगिंग और एसएलएफ 4 जे लॉगिंग फ्रेमवर्क को स्विच करना आसान बनाता है यदि आप चुनते हैं।

+3

+1 उत्कृष्ट सलाह – ninesided

2
  1. उपयोग उदा

    org.apache.log4j.BasicConfigurator.configure(new FileAppender( 
        new PatternLayout("%d{ISO8601} %-5p %t: %m%n"), // see e.g. http://en.wikipedia.org/wiki/Log4j#TTCC 
        "log/mainWhatever.log")); 
    
  2. logger.setLevel(...) का उपयोग करते हुए आप आसानी से logger.debug(..) संदेशों, उदा प्रदर्शित करने के लिए चुन सकते हैं कि इसे स्तर चेतावनी के लिए सेट करें और किसी भी ट्रेस, डीबग और जानकारी कथन मुद्रित नहीं किए जाएंगे। यह आपको कभी-कभी कभी-कभी आवश्यक डीबग स्टेटमेंट्स पर टिप्पणी करने का समय बचाता है।

Wikipedia पर भी एक नज़र डालें।

7

कुछ भी है कि आप System.out को मुद्रित करने के लिए "मानक बाहर" जाना होगा, और जब आप किसी फ़ाइल के लिए बाहर मानक अनुप्रेषित और यह तुलना कर सकते हैं, आप क्या है, कि बहुत अनम्य है। इसके अतिरिक्त, यदि आप System.out का उपयोग करते हैं तो आप मानक आउटपुट पर फ़िल्टर नहीं कर सकते हैं ... सब कुछ मुद्रित किया जाएगा।Log4j के साथ, आप अलग-अलग लॉगिंग स्तर सेट कर सकते हैं, ताकि एक निश्चित गंभीरता/महत्व सीमा से नीचे वाले संदेशों को लॉग इन नहीं किया जा सके (उदाहरण के लिए यदि आप लॉगिंग स्तर को WARN में बदलते हैं, तो DEBUG और INFO संदेश अब प्रदर्शित नहीं होंगे)।

इसके अतिरिक्त, log4j कक्षा-दर-वर्ग आधार पर लॉगिंग को नियंत्रित करने की अनुमति देता है, जबकि System.out केवल पूरे एप्लिकेशन की ग्रैन्युलरिटी पर नियंत्रित किया जा सकता है (यदि आप System.out को रीडायरेक्ट करते हैं, तो आप इसे संपूर्ण रूप से रीडायरेक्ट करते हैं कार्यक्रम)। इसके विपरीत, log4j में प्रत्येक लॉगर को एक अलग एपेंडर दिया जा सकता है। इसके अतिरिक्त, आप log4j लॉगर एकाधिक एपेंडर (ताकि यह सिस्टम लॉगर हो, और नेटवर्क पर, उदाहरण के लिए) दे सके। आप एक स्ट्रिंगबिल्डर को लॉग 4j लॉगर भी जोड़ सकते हैं, ताकि आप आसानी से जो लिखा हो उसे पढ़ सकें। और जबकि System.out को पुनर्निर्देशित किया जा सकता है, यह पुनर्निर्देशन काफी सीमित है; System.out को किसी फ़ाइल या किसी पाइप (किसी अन्य प्रोग्राम पर) पर रीडायरेक्ट किया जा सकता है, लेकिन आप इसे URL पर रीडायरेक्ट करने में सक्षम नहीं होंगे, उदाहरण के लिए; इसके विपरीत, एक एपेंडर बनाना बहुत आसान होगा जो HTTP पोस्ट का उपयोग करके लॉगिंग संदेशों को प्रसारित करता है।

0

logger.setLevel (...) का उपयोग करके आप आसानी से चुन सकते हैं कि logger.debug (..) संदेशों को प्रदर्शित करना है या नहीं, उदा। इसे स्तर चेतावनी के लिए सेट करें और किसी भी ट्रेस, डीबग और जानकारी कथन मुद्रित नहीं किए जाएंगे। यह आपको केवल कभी-कभी आवश्यक डीबग स्टेटमेंट्स पर टिप्पणी करने का समय बचाता है

0

लॉग 4j के मामले में, यह एक मध्यम वेयर सेवा प्रदान करता है जहां आप लॉगिंग स्तर जैसे डेबग, आईएनएफओ, त्रुटि आदि का प्रबंधन कर सकते हैं और आप सक्षम कर सकते हैं और लॉगिंग अक्षम करें। लेकिन System.out.println() के मामले में आपको हर चीज़ का प्रबंधन करना होगा।