जावा में लॉगिंग के साथ क्या है? [बन्द है]


117

एक दूसरे के बजाय निम्नलिखित पैकेजों में से एक का उपयोग क्यों करेगा?

  • जावा लॉगिंग
  • कॉमन्स लॉगिंग
  • log4j
  • SLF4j
  • Logback

4
आप stackoverflow.com/questions/873051 पर जाना चाहते हैं , जो SLF4j की तुलना कॉमन्स लॉगिंग से करता है।
जेम्स मैकमोहन

24
क्यों नरक Ceki 3 लॉगिंग फ्रेमवर्क बनाया है !!! पागलपन पागलपन ...
एम.पी.

6
@एमपी। - log4j पहले था, फिर असहमति पैदा हुई और slf4j + logback लिखा गया। slf4j एपीआई है और एपीआई के कार्यान्वयन को लॉगबैक करता है। बाकी सब कुछ के बावजूद, slf4j बेहद उपयोगी है।
थोरबजर्न रावन एंडरसन

3
Ceki Gülcü ने SLF4J + Logback का निर्माण क्यों किया, इसके विवरण के लिए निम्नलिखित Devoxx बात देखें: parleys.com/#st=5&id=1701
bitek

इससे बाहर आने के लिए सबसे अच्छी बात है slf4j एपीआई जो उम्मीद है कि लॉगिंग दुनिया को एकीकृत करेगा। मुझे लगता है कि लॉगबैक ने अभी तक डेवलपर्स के साथ महत्वपूर्ण द्रव्यमान हासिल नहीं किया है।
थोरबजोरन रावन एंडरसन

जवाबों:


86

एपी अपीयरेंस के कालानुक्रमिक क्रम में (जहाँ तक मुझे पता है):

  • Log4j क्योंकि ज्यादातर हर कोई इसका इस्तेमाल करता है (मेरे अनुभव में)
  • कॉमन्स लॉगिंग क्योंकि ओपन सोर्स प्रोजेक्ट इसका उपयोग करते हैं (इसलिए वे एकीकृत समाधान में लॉगिंग फ्रेमवर्क का उपयोग करने के साथ एकीकृत कर सकते हैं); विशेष रूप से मान्य यदि आप एक एपीआई / फ्रेमवर्क / ओएसएस हैं और आप कॉमन्स लॉगिंग का उपयोग करने वाले अन्य पैकेजों पर भरोसा करते हैं।
  • कॉमन्स लॉगिंग क्योंकि आप एक विशेष लॉगिंग फ्रेमवर्क को "लॉक डाउन" नहीं करना चाहते हैं (इसलिए इसके बजाय आप कॉमन लॉगिंग के बजाय इसे लॉक करते हैं) - मुझे नहीं लगता कि इस बिंदु को कारण के रूप में उपयोग करने का निर्णय लेना समझदारी है।
  • जावा लॉगिंग क्योंकि आप एक अतिरिक्त जार में जोड़ना नहीं चाहते हैं।
  • SLF4j क्योंकि यह कॉमन्स लॉगिंग से नया है और पैरामीटर लॉगिंग प्रदान करता है:

logger.debug("The entry is {}.", entry);
//which expands effectively to
if (logger.isDebugEnabled()){
    // Note that it's actually *more* efficient than this - see Huxi's comment below...
    logger.debug("The entry is " + entry + "."); 
}
  • लॉगबैक क्योंकि यह लॉग 4 जे से नया है और फिर से, पैरामीटराइज़्ड लॉगिंग का समर्थन करता है, क्योंकि यह सीधे एसएलएफ 4 जे को लागू करता है
  • SLF4j / लोगबैक क्योंकि यह उसी लड़के द्वारा लिखा गया है जिसने log4j किया है, इसलिए उसने इसे बेहतर बनाया है ( केन जी के अनुसार - धन्यवाद। यह उनके पहले के समाचार पोस्ट्स को देखते समय फिट होता है )
  • SLF4j क्योंकि वे एक log4j एडॉप्टर भी प्रकाशित करते हैं, इसलिए आपको पुराने कोड में "out4j" को बदलने की जरूरत नहीं है - बस log4j को बनायें। प्रोपराइट्स SLF4j का उपयोग करें और यह कॉन्फ़िगरेशन है

3
जहां तक ​​मैं कॉमन लॉगिंग के पीछे का विचार बता सकता हूं कि इसका उपयोग पुस्तकालयों में किया जाना चाहिए। इस तरह से लाइब्रेरी हमेशा एक ही लॉगिंग फ्रेमवर्क (कॉमन्स लॉगिंग के माध्यम से) का उपयोग कर सकती है जिसे होस्टिंग एप्लिकेशन उपयोग करता है।
जोआचिम सॉउर

धन्यवाद सवाल के लिए लोकी को ढेर। अब मुझे पता है कि मैं अपने डिफ़ॉल्ट ढांचे के रूप में log4j का उपयोग नहीं करने जा रहा हूं। SLF4j FTW! केन जी के लिए धन्यवाद यह बताने के लिए कि SLF4j को उसी लड़के ने log4j के रूप में लिखा है
स्टीफन

3
आपके कोड उदाहरण में टिप्पणी 100% सही नहीं है। संदेश का वास्तविक स्वरूपण लॉज़िक द्वारा किया जाता है, इसलिए यह केवल तभी होगा जब ईवेंट को वास्तव में एक परिशिष्ट द्वारा संभाला जाएगा और परिशिष्ट को प्रारूपित संदेश की आवश्यकता है - जो कि सॉकेटऐपेंडर के मामले में नहीं होगा, क्योंकि ईवेंट के उपयोग से क्रमबद्ध है अपरिवर्तित संदेश पैटर्न + स्ट्रिंग्स के रूप में तर्क। मुझे लगता है कि यह सिर्फ इस बात पर निर्भर करता है कि आप "प्रभावी" कैसे परिभाषित करते हैं। यह निश्चित रूप से एक ही संदेश का उत्सर्जन करेगा (कम से कम अगर प्रविष्टि और ऑब्जेक्ट समान हैं;)) तो कृपया मेरे नाइटपैकिंग को माफ कर दें।
हक्सी

6
SLF4J वास्तव में सिर्फ एक एपीआई है जो अन्य लॉगिंग फ्रेमवर्क के शीर्ष पर बैठता है। कॉमन्स लॉगिंग के लक्ष्य के समान, लेकिन मेरे अनुभव से अधिक सहज।
जेम्स मैकमोहन

37

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

जावा के शुरुआती संस्करणों में इस परिदृश्य के लिए अंतर्निहित लॉगिंग फ्रेमवर्क नहीं था।


19
क्या यह एक उत्तर है? यह एक शेख़ी की तरह दिखता है।
माइकल मायर्स

15
मुझे क्षमा करें। यह है एक शेख़ी का एक छोटा सा। लेकिन "जावा में लॉगिंग के साथ क्या हो रहा है?" जवाब, संक्षेप में, यह गहराई से टूट गया है।
जुलिएन चाटंग 23

1
अच्छी तरह से यह एक -1 वोट के लायक नहीं है; पी लेकिन के बारे में विचार करने के लिए कुछ।
पुरुषुम

21
समस्याएं तब शुरू हुईं जब सूर्य ने वास्तव में जावा 1.4 में java.util.log को जोड़ा। इससे पहले LOG4J अच्छी तरह से स्थापित और व्यापक उपयोग में था। उसके बाद Log4J और java.util.log दोनों का समर्थन करने के लिए रैपर की आवश्यकता थी। इसके अलावा, चूंकि जूल जावा में निहित है। * पैकेज, इसे JAR की अदला-बदली के द्वारा प्रतिस्थापित नहीं किया जा सकता है - जो कि SLF4J अन्य ढाँचों को पाटता है। यह शायद अब तक का सबसे बुरा सूर्य विचार था ... और अंततः यह गलत धारणा बन गई कि "अच्छे जावा नागरिक" को जूल का उपयोग करना चाहिए।
हक्सी

4
@ हक्सी, मैं कहता हूं कि कैलेंडर एपीआई बदतर था। सूर्य की रक्षा में यह उनका कोड नहीं था, लेकिन Taglient से आया था।
Thorbjørn रावन एंडरसन

22

पहले एक महत्वपूर्ण बिंदु है जिसका उल्लेख नहीं किया गया था:

SLF4J (और लॉगबैक और लॉग 4 जे दोनों लॉगिंग बैकएंड के रूप में) तथाकथित डायग्नोस्टिक कॉन्सेप्ट (एमडीसी, जेवाडॉक और प्रलेखन देखें ) के लिए समर्थन है।

यह अनिवार्य रूप से एक थ्रेड-लोकल मैप है <string, String> जिसे आप अपने लॉगिंग ईवेंट में अतिरिक्त संदर्भ जानकारी जोड़ने के लिए उपयोग कर सकते हैं। एमडीसी की वर्तमान स्थिति हर घटना से जुड़ी हुई है।

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


2
तकनीकी रूप से, यह एक थ्रेड-लोकल मैप है <स्ट्रींग, स्ट्रिंग>।
pdxleif

17

प्रश्न का उत्तर भी देखें त्रुटि को लॉग करने के लिए सबसे अच्छा अभ्यास क्या हैं? , ख़ास तौर पर:

  • कॉमन्स लॉगिंग के साथ कुछ संभावित क्लास लोडिंग मुद्दे हैं।

  • Log4J और SLF4J को एक ही व्यक्ति द्वारा विकसित किया गया था, Log4J के साथ व्यवहार में पाए जाने वाले मुद्दों से सीखते हुए।


4

हमारी कंपनी की परियोजना में हम लॉग 4 जे का उपयोग करते हैं और स्टीफन की तरह इसका उपयोग करना बहुत आसान है जैसा कि उनके उदाहरण में दिखाया गया है। हमने LOG4j के लिए अपनी स्वयं की पैटर्न कक्षाएं भी लिखी हैं ताकि आप अपनी स्वयं की आउटपुट फ़ाइल स्कीमा बना सकें। आप बता सकते हैं कि आपकी लॉग फ़ाइल कैसी दिखनी चाहिए। मूल log4j कक्षाओं को बढ़ाना संभव है।

सभी Log4j गुण जिन्हें आप log4j.properties फ़ाइल में बदल सकते हैं, इसलिए आप विभिन्न प्रोजेक्ट्स के लिए विभिन्न फ़ाइलों का उपयोग कर सकते हैं।

जावा लॉगिंग मेरा पक्षधर नहीं है, लेकिन यह इसलिए हो सकता है क्योंकि मैं शुरुआत से लॉग 4 जे का उपयोग करता हूं।


4

कॉमन्स लॉगिंग सिंहावलोकन , पुस्तकालय कोड से प्रवेश आप अंतर्निहित प्रवेश ढांचे पर कोई नियंत्रण नहीं है जब: अपने अस्तित्व के लिए कारण देता है। विभिन्न अपाचे परियोजनाओं के लिए बहुत महत्वपूर्ण है, जिन्हें बाहरी अनुप्रयोगों में जोड़ा जाएगा। आंतरिक आईटी परियोजनाओं के लिए शायद इतना महत्वपूर्ण नहीं है, जहां आपका पूरा नियंत्रण है।

उस ने कहा, मैं कॉमन्स लॉगिंग को लिखता हूं, जैसा कि मुझे पता है कि कई अन्य डेवलपर्स हैं। इसका कारण मानसिक सामान को कम करना है: आप परियोजनाओं या नौकरियों को बदल सकते हैं, और एक नया ढांचा नहीं सीखना होगा (बशर्ते कि नई नौकरी / परियोजना सीएल का उपयोग भी करती है, और / या आप उन्हें इसे स्थानांतरित करने के लिए मना सकते हैं)।

साथ ही, आपके द्वारा उपयोग किए जाने वाले ढांचे के आसपास अपने स्वयं के रैपर बनाने के लिए कुछ मूल्य है। जैसा कि यहाँ वर्णित है , मुझे कस्टम स्ट्रिंग (महत्वपूर्ण) प्रदान करने के लिए एक लॉगवॉपर ऑब्जेक्ट का उपयोग करना पसंद है, और लॉगिंग स्टेटमेंट (कम महत्वपूर्ण) के दृश्य अव्यवस्था को कम करना है।


1
वहाँ भी एक commons.log => SLF4J पुल है जिसका उपयोग SLF4J पर सभी CL लॉगिंग को रूट करने के लिए किया जा सकता है। SLF4J commons.log, LOG4J और (थोड़ा बोझिल, लेकिन जितना संभव हो उतना अच्छा) के ब्रिजिंग का समर्थन करता है। java.util.log इसलिए सभी लॉग जो भी SLF4J बैकेंड आप उपयोग करेंगे, में समाप्त हो जाएंगे। Slf4j.org/legacy.html देखें मैं Logback, btw का उपयोग करूंगा, लेकिन आप तर्क दे सकते हैं कि मैं पक्षपाती हूं।
हक्सी

2

आम तौर पर मैं Log4J का उपयोग करने के लिए डिफ़ॉल्ट होगा।

अगर मैं जावा 1.4 पर निर्भरता को बुरा नहीं मानता तो मैं जावा लॉगिंग का उपयोग करूंगा लेकिन फिर भी मैं प्राथमिकता में लॉग 4 जे का उपयोग करूंगा।

अगर मैं पहले से ही इसका इस्तेमाल कर रहा हूँ तो मैं कुछ बढ़ाने के लिए कॉमन्स लॉगिंग का उपयोग करूँगा।


1.4 पर निर्भरता का मन नहीं था ?? यहां तक ​​कि 1.4 ने सेवा जीवन के अपने अंत को मारा है।
टॉम हॉल्टिन -

2
@ टॉम का मतलब है कि वह jdk1.4 + मूर्खतापूर्ण नहीं है।
एम.पी.

वास्तव में मैंने हाल ही में एक सिस्टम में कुछ काम किया है जो अभी भी jdk 1.3 :-( के तहत चल रहा था, और यह दो साल से भी कम समय पहले था जब मैं अंतिम बार jdk 1.2 सिस्टम को बनाए रख रहा था । बहुत से स्थानों को अपग्रेड नहीं किया जाता जब तक कि वे पूरी तरह से नहीं होते। , वे सिर्फ उन्नयन स्थापित करने से इनकार करते हैं।
माइकल रदरफर्ड

0

मेरा सुझाव है कि एक पतली लॉगिंग मुखौटा बनाना चाहिए जो लॉगिंग फ्रेमवर्क में से किसी को भी लिख सकता है, जिस बिंदु पर बैकिंग इंजन की पसंद बहुत अधिक मूट बिंदु बन जाती है।


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

+1 कॉमन लॉगिंग तर्क को काउंटर करने के लिए, कुछ एंटरप्राइज़ ऐप्स कस्टम लकड़हारे का उपयोग करते हैं। अंतर्निहित कार्यान्वयन को छिपाने के लिए हमेशा एक अच्छा विचार है। 'पतला' रैपर पैक किए जा रहे एक और जार की आवश्यकता को समाप्त कर देता है और यह उतना अधिक नहीं है जितना कि पुनर्निवेश।
क्वेस्टजन डे

1
इसने मुझे हाल ही में बचाया जब हमने अपने ढांचे को कॉम्पैक्ट फ्रेमवर्क (इन .Net) में पोर्ट कराया। यदि हमारे पास nLog पर हार्डकॉन्ड निर्भरता होती, तो हम खराब हो जाते। क्योंकि हमने इस दृष्टिकोण का उपयोग किया था, इसलिए हम अशक्त लकड़हारे को छोड़ने और खुश रहने में सक्षम थे। कोई मुझे 0 वोट करने के लिए वापस वोट करें :-)
tsimon

3
एक पहले से मौजूद है - slf4j पर एक नज़र डालें। यह एक स्वीकृत पतला आवरण है जो आपको रनटाइम क्लासपथ पर जार को स्विच करके एप्लिकेशन स्टार्टअप पर लॉगिंग चौखटे को बदलने की अनुमति देता है।
deterb

1
क्लॉगिंग का यह पता लगाने का अपना तरीका है कि यह किस फ्रेमवर्क का उपयोग करेगा - इसकी अच्छी और अच्छी तरह से व्याख्या नहीं है। सेगी ने कितने लॉगिंग फ्रेमवर्क बनाए हैं। किसी को हमेशा इंटरप्रेन्योर के स्तर को बदलने का प्रयास करना चाहिए और कार्यान्वयन को छुपाना चाहिए, भले ही यह आपके लॉगिंग के साथ क्लॉगिंग हो। पर्दे के पीछे आप ट्रैविस द्वारा बताए गए इच्छा के अनुसार जो भी एफ / डब्ल्यू चाहते हैं, उसे प्लगइन कर सकते हैं।
एम.पी.
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.