log4j

2010-04-30 14 views
10

का लाभ log4j का लाभ System.out और System.err पर लॉग फ़ाइल में आउटपुट करने का क्या फायदा है?log4j

+0

मुझे लगता है कि log4j बहुत अधिक अनावश्यक जटिलता पेश करता है। यह भी बहुत घुसपैठिया है। इस वैकल्पिक दृष्टिकोण में एक नज़र डालें जो लॉगिंग सुविधा के रूप में एक गणना वर्ग का उपयोग करता है: http://mentalog.soliveirajr.com – TraderJoeChicago

उत्तर

12

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

यह महत्वपूर्ण रूप से महत्वपूर्ण है क्योंकि डेवलपर्स के लिए यह अनुमान लगाना कठिन होता है कि सॉफ़्टवेयर उत्पादन में आने के बाद लॉगिंग की ज़रूरतें कैसे बदल जाएंगी। उस सॉफ़्टवेयर को प्रबंधित करने वाली ऑपरेशंस टीमों को कम वर्बोज़ लॉग की आवश्यकता हो सकती है, मल्टीप्लॉग लॉग की आवश्यकता हो सकती है, उन्हें कई सर्वरों पर उन लॉग को शिप करने की आवश्यकता हो सकती है, कभी-कभी समस्या निवारण आदि के लिए वास्तव में वर्बोज़ डेटा प्राप्त करने की आवश्यकता हो सकती है और यदि आमतौर पर ऑपरेशन टीमों के लिए यह असंभव है, बड़ा कोड परिवर्तन करने के लिए डेवलपर को मनाने के लिए लॉगिंग कैसे काम करता है, यह बदलने के लिए। यह अक्सर उत्पादन डाउनटाइम, संचालन और विकास के बीच घर्षण, और आसपास के समय बर्बाद हो जाता है।

डेवलपर के दृष्टिकोण से, Log4j आपको लॉगिंग का समर्थन करने के लिए कोड परिवर्तन करने से रोकता है, और आपको लॉग इन परिवर्तनों वाले लोगों द्वारा परेशान होने से प्रेरित करता है। यह लोगों को आपके कोड को प्रबंधित करने के बजाए अपने स्वयं के खुजली को खरोंच करने में सक्षम बनाता है!

इसके अलावा, चूंकि लॉग 4j जावा लॉगिंग के लिए डी-फैक्टो मानक है, इसलिए बहुत से टूल्स उपलब्ध हैं जो लॉग 4j के साथ अच्छी चीजें कर सकते हैं - इसके अलावा आपको और आपकी ऑपरेशन टीमों को पहिया की पुन: आविष्कार करने से रोकते हैं।

मेरी पसंदीदा विशेषता आसानी से लिखने की क्षमता है जो SYSLOG, Splunk इत्यादि जैसे गैर-फाइल स्रोतों को डेटा भेजती है, जिससे आपके आईपी विभाग पहले से ही आपके आईटी विभाग के संचालन प्रबंधन टूल में आपके ऐप के कस्टम लॉगिंग को आसान बनाता है।

+0

लॉग 4j एक डिफैक्टो मानक था, लेकिन java.util.logging, कॉमन्स लॉगिंग और कई अन्य लॉगिंग फ्रेमवर्क के साथ यह समर्थन करता है, मुझे यकीन नहीं है कि यह अभी भी सच है। कई ओपन सोर्स प्रोजेक्ट जिन्हें मैंने हाल ही में देखा है, अब लॉग 4j का उपयोग नहीं करते हैं। – justkt

+0

Log4j जावा लॉगिंग का प्रिय नहीं हो सकता है, लेकिन यह अभी भी System.out/.error से कहीं बेहतर है। कॉमन्स लॉगिंग को भी बदला जा रहा है और जेडीके लॉगिंग हमेशा 'आविष्कार नहीं किया गया' सिंड्रोम का मामला था। – SteveD

+0

क्या यह एक डुप्लिकेट है या क्या यह संभव है कि इस प्रश्न का मूल अभी तक नहीं पूछा गया है? मैं संदिग्ध हूं लेकिन आश्चर्यचकित होना चाहता हूं। मेरी त्वरित खोज को एक स्पष्ट डुप्ली नहीं मिला लेकिन यह एक संपूर्ण खोज नहीं थी। –

1

मेरे पसंदीदा (सभी नहीं) फिर कंपाइल तरह से स्थापित करने के लिए लॉग

  • की क्षमता के बिना, config में प्रवेश के मापदंडों सेट करने के लिए

    • की क्षमता (पाठ फ़ाइल से एसएमटीपी प्रेषक को) लिखा है
    • की क्षमता गंभीरता से फ़िल्टर करने के लिए
  • 1

    स्तर, स्वरूपण, एकाधिक फ़ाइलों पर लॉगिंग ... एक लॉगिंग फ्रेमवर्क (भले ही यह java.util.logging है) वास्तव में फायदेमंद है यदि कोई मौका गलत हो सकता है ile आपका कोड चल रहा है।

    1

    Log4j आकार के आधार पर आपकी लॉग फ़ाइलों को घुमाने और मात्रा (logrotate) के आधार पर उन्हें हटाने की क्षमता प्रदान करता है, इसलिए आपके सर्वर अपनी डिस्क भर नहीं पाते हैं। व्यक्तिगत रूप से मुझे लगता है कि Log4j में अधिक मूल्यवान सुविधाओं में से एक है।

    इसके अलावा Log4j कई डेवलपर्स द्वारा लोकप्रिय और समझा जाता है। मैंने जिन तीनों कंपनियों पर काम किया है, उनमें अधिकांश परियोजनाओं में लॉग 4j का उपयोग किया गया है।

    1

    log4j आपको विभिन्न संसाधनों जैसे लॉग इन करने की अनुमति देता है उदा। इवेंट लॉग, ईमेल, फाइल सिस्टम इत्यादि। जबकि इन सभी संसाधनों से आपके एप्लिकेशन को डीकॉप्ल किया जा सकता है। इसके अलावा, आप अपने संबंधित एपीआई को सीखने या एकीकृत करने के बिना विभिन्न संसाधनों पर लॉग इन करने के लिए एक सामान्य इंटरफेस का उपयोग करना चाहते हैं।

    7

    असल में, आपको इन दिनों slf4j मुखौटा देखना चाहिए, क्योंकि यह आपको सबसे संक्षिप्त विवरणों के लिए {} प्लेसहोल्डर्स का उपयोग करने की अनुमति देता है।फिर आप अपने लॉग स्टेटमेंट के वास्तविक उपचार को संभालने के लिए slf4j के पीछे उपयुक्त लॉगिंग फ्रेमवर्क का उपयोग कर सकते हैं। यह log4j या slf4j-simple हो सकता है जो सिर्फ INFO, WARN और ERROR को प्रिंट करता है, और बाकी को छोड़ देता है।

    महत्वपूर्ण अवलोकन आपको बनाने की आवश्यकता है कि कोड लिखने पर लॉग विवरणों का लेखन किया जाता है, और कोड की तैनाती के दौरान आवश्यकतानुसार निर्णय लिया जाता है, जो कोड लिखने के कई सालों बाद हो सकता है और परीक्षण किया। System.out.println के लिए आपको उनसे छुटकारा पाने के लिए शारीरिक रूप से अपना कोड बदलने की आवश्यकता है, जो एक कठोर लेखन-परीक्षण-तैनाती चक्र में अस्वीकार्य है। अगर कोड बदलता है, तो इसे पुनः लोड किया जाना चाहिए। Slf4j के साथ आप बस उन लोगों को सक्षम करते हैं जिन्हें आप देखना चाहते हैं।

    हमारे पास परीक्षण चरण में पूर्ण लॉगिंग है, और उत्पादन तैनाती की प्रारंभिक अवधि में वर्बोज़ लॉगिंग है, जिसके बाद हम केवल जानकारी पर जाते हैं। यह हमें एक परिदृश्य में पूरी जानकारी देता है जहां एक केस डीबग करना बहुत ही कम संभव है।

    आपको यह लेख मिल सकता है जो मैंने दिलचस्प लिखा था। लक्षित दर्शक शुरुआत से अच्छी आदतें देने के अपने इरादे से, जावा प्रोग्रामर शुरू कर रहे हैं। http://runjva.appspot.com/logging101/index.html

    1

    एक नज़र डालें और आप log4j की शक्ति को समझने होगा:

    # ALL < DEBUG < INFO < WARN < ERROR < FATAL < OFF 
    
    # No appenders for rootLogger 
    log4j.rootLogger=OFF 
    
    folder=.. 
    prefix= 
    fileExtension=.log 
    htmlExtension=${fileExtension}.html 
    datestamp=yyyy-MM-dd/HH:mm:ss.SSS/zzz 
    layout=%d{${datestamp}} ms=%-4r [%t] %-5p %l %n%m %n%n 
    
    # myLogger logger 
    log4j.logger.myLogger=ALL, stdout, infoFile, infoHtml, errorFile 
    
    # stdout 
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender 
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 
    log4j.appender.stdout.layout.ConversionPattern=${layout} 
    # infoFile 
    log4j.appender.infoFile=org.apache.log4j.FileAppender 
    log4j.appender.infoFile.File=${folder}/${prefix}_info${fileExtension} 
    log4j.appender.infoFile.layout=org.apache.log4j.PatternLayout 
    log4j.appender.infoFile.layout.ConversionPattern=${layout} 
    # infoHtml 
    log4j.appender.infoHtml=org.apache.log4j.FileAppender 
    log4j.appender.infoHtml.File=${folder}/${prefix}_info${htmlExtension} 
    log4j.appender.infoHtml.layout=org.apache.log4j.HTMLLayout 
    log4j.appender.infoHtml.layout.Title=Logs 
    log4j.appender.infoHtml.layout.LocationInfo=true 
    # errorFile 
    log4j.appender.errorFile=org.apache.log4j.FileAppender 
    log4j.appender.errorFile.File=${folder}/${prefix}_error${fileExtension} 
    log4j.appender.errorFile.layout=org.apache.log4j.PatternLayout 
    log4j.appender.errorFile.layout.ConversionPattern=${layout} 
    
    # APPENDERS SETTINGS 
    log4j.appender.stdout.Threshold = ALL 
    log4j.appender.infoFile.Threshold = INFO 
    log4j.appender.infoHtml.Threshold = INFO 
    log4j.appender.errorFile.Threshold = WARN. 
    

    अपने जावा कोड आप कर सकते हैं में चर बदलने के लिए:

    log4j.properties मैं एक परियोजना के लिए एक बार इस्तेमाल कार्य करें:

    लोड हो रहा है विन्यास

    Log4j स्वचालित रूप से कॉन्फ़िगरेशन लोड करेगा यदि यह फ़ाइल "log4j.properties" नामक फ़ाइल में संग्रहीत है और "(उदा।" के तहत क्लासपाथ पर मौजूद है (उदा। वेब-INF/वर्गों/log4j.properties)।

    मुझे लगता है कि दृष्टिकोण पसंद नहीं और फोन करके स्पष्ट रूप से विन्यास लोड करने के लिए पसंद करते हैं:

    PropertyConfigurator.configure (Config.ETC + "/log4j.properties"); इस तरह से मैं किसी भी समय कॉन्फ़िगरेशन को फिर से लोड कर सकता हूं जब तक कि मेरा एप्लिकेशन अभी भी चल रहा है। मैं प्रशासनिक जेएसपी, "लॉग 4 लॉग पुनः लोड करें" में एक बटन जोड़ना चाहता हूं।

    गतिशील लॉग फ़ाइल स्थान

    बहुत से लोग शिकायत करते हैं कि कड़ी मेहनत से कोड को log4j बलों आप स्थान जहां अपने लॉग रखा जाएगा। दरअसल, गतिशील रूप से लॉग-फ़ाइल स्थान चुनना संभव है, खासकर यदि आप उपरोक्त $ {log.dir} संपत्ति प्रतिस्थापन तकनीक का उपयोग करते हैं।आइए जानें:

    String dynamicLog = // log directory somehow chosen... 
    Properties p = new Properties(Config.ETC + "/log4j.properties"); 
    p.put("log.dir", dynamicLog); // overwrite "log.dir" 
    PropertyConfigurator.configure(p); 
    
    0
    • लॉगिंग (दस्तावेज़ ऐतिहासिक व्यापार की घटनाओं घटित कि, आप पुराने लॉग की जांच कर सकते हैं)
    • ट्रैक आवेदन (परियोजना प्रवाह)
    • आवेदन डिबगिंग (विस्तृत जानकारी क्या होता है ग्रैनुलर स्तर // डेटा, मूल्य और सभी अंदरूनी तरीकों पर एक विधि में)
    • त्रुटि प्रबंधन (होने वाली विशिष्ट त्रुटि के बारे में जानकारी)

     संबंधित मुद्दे