log4j बनाम logback [बंद]


152

हम सेल्फमेड रैपर के पीछे log4j का उपयोग कर रहे हैं। हम अब इसकी और अधिक विशेषताओं का उपयोग करने की योजना बना रहे हैं।

क्या हमें लॉगबैक पर अद्यतन करना चाहिए?

(मेरा मतलब है कि फ्रेमवर्क SLF4J की तरह नहीं है)


1
लॉगबैक, जकार्ता कॉमन्स लॉगिंग के समान लगता है - मुख्य अंतर क्या हैं?
मैट बी

12
SLF4J (जो कि मुखौटा है) commons.log के समान लगता है। मुख्य अंतर यह है कि SLF4J स्थिर बाइंडिंग का उपयोग कर रहा है, जबकि कॉमन्स.लॉगिंग कुछ रिज़ॉल्यूशन रणनीति का उपयोग कर रहा है। Logback ("देशी" (यानी अतिरिक्त आवरण की परत नहीं है) मुखौटा का कार्यान्वयन) Log4J के लिए तुलनीय है, लेकिन एक अमीर एपीआई है।
हक्सी

जवाबों:


190

लॉगबैक मूल रूप से SLF4J API को लागू करता है। इसका मतलब है कि यदि आप लॉगबैक का उपयोग कर रहे हैं, तो आप वास्तव में SLF4J API का उपयोग कर रहे हैं। आप सैद्धांतिक रूप से लॉगिंग के लिए सीधे लॉगबैक एपीआई के आंतरिक का उपयोग कर सकते हैं, लेकिन यह अत्यधिक हतोत्साहित करता है। सभी लॉगबैक प्रलेखन और लॉगर्स पर उदाहरण SLF4J एपीआई के संदर्भ में लिखे गए हैं।

तो लॉगबैक का उपयोग करके, आप वास्तव में SLF4J का उपयोग करेंगे और यदि किसी भी कारण से आप log4j पर वापस जाना चाहते हैं, तो आप मिनटों में ऐसा कर सकते हैं बस अपने वर्ग पथ पर slf4j-log4j12.jar को छोड़ दें।

जब लॉगबैक से लॉग 4 जे में माइग्रेट किया जाता है, तो लॉगबैक विशिष्ट भागों, विशेष रूप से लॉगबैक.एक्सएमएल कॉन्फ़िगरेशन फाइल में निहित है, फिर भी इसके लॉग 4 जे समकक्ष, यानी लॉग 4 जे.प्रोपरेटीज में माइग्रेट करना होगा । जब दूसरी दिशा में माइग्रेट हो रहा है, तो log4j कॉन्फ़िगरेशन, यानी log4j.properties , को इसके शीर्ष समकक्ष के रूप में परिवर्तित करना होगा। उसके लिए एक ऑन लाइन टूल है। कॉन्फ़िगरेशन फ़ाइलों को माइग्रेट करने में शामिल कार्य की मात्रा आपके सभी सॉफ़्टवेयर के स्रोत कोड और इसकी निर्भरता में प्रसारित किए गए लकड़हारा कॉल को माइग्रेट करने के लिए आवश्यक कार्य से बहुत कम है।


28
इस तरह के एक व्यापक रूप से लोकप्रिय सॉफ्टवेयर के डेवलपर से बात करने का यह एक वास्तविक अवसर है। Log4j के लिए धन्यवाद Ceki।
सर्जन कुमार गुल्ला

7
अस्वीकरण: यह लड़का Log4j, SLF4J और लॉगबैक के सभी का मूल डेवलपर है। लेकिन Log4j के लिए अब और काम न करें।
विक्टर स्टैफुसा

56

अगर आप? जी हां

क्यों? Log4J अनिवार्य रूप से Logback द्वारा पदावनत किया गया है ।

अत्यावश्यक है? शायद नहीं।

क्या यह दर्द रहित है? शायद, लेकिन यह आपके लॉगिंग स्टेटमेंट पर निर्भर हो सकता है।

ध्यान दें कि यदि आप वास्तव में LogBack (या SLF4J) का पूरा लाभ लेना चाहते हैं, तो आपको वास्तव में उचित लॉगिंग स्टेटमेंट लिखने की आवश्यकता है । यह आलसी मूल्यांकन के कारण तेजी से कोड जैसे फायदे प्राप्त करेगा, और कोड की कम लाइनें क्योंकि आप गार्ड से बच सकते हैं।

अंत में, मैं अत्यधिक SLF4J की सिफारिश करता हूं। (क्यों पहिया अपने स्वयं के मुखौटा के साथ फिर से बनाएँ?)


48
नोट: log4j प्रोजेक्ट log4j को हटाए गए पर विचार नहीं करता है।
थोर्बोजर्न रेवन एंडरसन

17
शब्दावली को स्पष्ट किया जाना चाहिए; स्पष्ट, log4j परियोजना के लेखक मानता है logback उत्तराधिकारी होने के लिए log4j की। यह दोनों परियोजनाओं का एक ही लेखक है, इसलिए उनकी राय में कुछ वजन होना चाहिए; "log4j प्रोजेक्ट" अपने आप में वास्तव में कुछ भी "विचार" नहीं करता है। Log4j से जुड़े लोगों के वर्तमान समूह की राय अलग-अलग है (कुछ वास्तव में सहमत हैं, कुछ असहमत हैं)। हमारे पीछे थोड़े और इतिहास के साथ (मूल टिप्पणी के बाद 3 वर्ष), SLF4J + लोगबैक, 3 जीजे से अधिक लाभ प्राप्त करना जारी रखेगा।
माइकल

@michael_n कृपया ध्यान दें कि Log4j 1 एक व्यक्ति द्वारा नहीं लिखा गया था। "एक ही लेखक" कहना गलत है। सेकी एक महत्वपूर्ण लेखक है, संदेह नहीं, लेकिन केवल एक ही नहीं। वास्तव में बहुत से लोगों ने Log4j 1 बनाने में मदद की कि यह क्या है।
क्रिश्चियन

@Christian "लिखा नहीं गया था ..." बेशक, यह किसी भी परिपक्व अपाचे परियोजना के लिए निहित होना चाहिए (और मेरी योग्यता, "log4j से जुड़े लोगों का वर्तमान समूह"); फिर भी, अगर मैं टिप्पणी को संपादित कर सकता हूं, तो मैं " मूल रूप से लेखक" कहूंगा , क्योंकि विकिपीडिया लेख भी बताता है। पुन: "वास्तव में बहुत से लोगों ने लॉग 4j 1 बनाने में मदद की कि यह क्या है" , यह बिल्कुल, समान रूप से सच है (यानी, बेहतर या बदतर के लिए); और भी, कुछ छोटे तरीके से, slf4j + logback की स्थापना में योगदान दिया :-)
माइकल

3
तो, आप सभी के लिए इस या उस लॉगिंग लाइब्रेरी से लड़ने के लिए क्या है? हम पुस्तकालयों को मारने / बढ़ावा देने की कोशिश क्यों कर रहे हैं? कम से कम कुछ तर्कसंगत तर्क प्रदान करें कि क्यों एक दूसरे से बेहतर है। भगवान, स्टैक ओवरफ्लो एक गड़बड़ है।
यूजर

48

लॉगिंग की दुनिया में (अपाचे कॉमन्स लॉगिंग, slf4j या यहां तक ​​कि Log4j 2.0 API) और कार्यान्वयन (Log4j 1 + 2, java.util.log, TinyLog, Logback) जैसे पहलू हैं।

मूल रूप से आपको अपने सेल्फमेड रैपर को slf4j IF से बदलना चाहिए और केवल IF यदि आप किसी कारण से इससे खुश नहीं हैं। जबकि Apache Commons Logging वास्तव में एक आधुनिक API, slf4j प्रदान नहीं कर रहा है और नया Log4j 2 मुखौटा प्रदान कर रहा है। यह देखते हुए कि एप्स का एक गुच्छा slf4j को एक रैपर के रूप में उपयोग करता है, यह उपयोग करने के लिए समझ में आता है।

slf4j कई अच्छी एपीआई चीनी देता है, जैसे कि slf4j डॉक्स से यह उदाहरण:

logger.debug("Temperature set to {}. Old temperature was {}.", t, oldT);

यह परिवर्तनशील प्रतिस्थापन है। यह भी Log4j 2 द्वारा समर्थित है।

हालाँकि आपको इस बात की जानकारी होनी चाहिए कि slf4j को QOS द्वारा विकसित किया गया है जो लॉगबैक को भी बनाए रखते हैं। Log4j 2.0 को Apache Software Foundation में बेक किया गया है। पिछले तीन वर्षों में एक जीवंत और सक्रिय समुदाय फिर से विकसित हुआ है। यदि आप ओपन सोर्स की सराहना करते हैं जैसा कि Apache Software Foundation द्वारा किया गया है तो इसकी सभी गारंटियों के साथ आप सीधे Log4j 2 का उपयोग करने के लिए slf4j का उपयोग करके पुनर्विचार कर सकते हैं।

कृपया ध्यान दें:

पिछले log4j 1 में सक्रिय रूप से बनाए नहीं रखा गया था जबकि लॉगबैक था। लेकिन आज हालात अलग हैं। Log4j 2 सक्रिय रूप से बनाए रखा है और लगभग नियमित समय पर जारी करता है। इसमें बहुत सारी आधुनिक विशेषताएं शामिल हैं और -imho- कुछ चीजों को लॉगबैक से बेहतर बनाता है। यह कभी-कभी स्वाद का मामला होता है और आपको अपना निष्कर्ष निकालना चाहिए।

मैंने Log4j 2.0 की नई विशेषताओं पर एक त्वरित अवलोकन लिखा: http://www.grobmeier.de/the-new-log4j-2-0-05122012.html

पढ़ते समय आप देखेंगे कि Log4j 2 लॉगबैक से प्रेरित था लेकिन अन्य लॉगिंग फ्रेमवर्क द्वारा भी। लेकिन कोड का आधार अलग है; यह Log4j 1 के साथ लगभग कुछ भी साझा नहीं करता है और Logback के साथ शून्य है। इससे कुछ सुधार होते हैं जैसे कि Log4j 2 हुड के नीचे स्ट्रिंग्स के बजाय बाइटस्ट्रीम के साथ संचालित होता है। यह भी पुन: कॉन्फ़िगर करते समय घटनाओं को ढीला नहीं करता है।

Log4j 2 मुझे ज्ञात अन्य चौखटों की तुलना में अधिक गति से लॉग इन कर सकता है: http://www.grobmeier.de/log4j-2-performance-close-to-insane-20072013.html

और फिर भी उपयोगकर्ता समुदाय लॉगबैक की तुलना में बहुत बड़ा लगता है: http://www.grobmeier.de/apache-log4j-is-the-leading-log-framework-06082013.html

सभी ने कहा कि सबसे अच्छा विचार यह है कि आप लॉगिंग चौखटे को चुनते हैं जो कि आप जो हासिल करना चाहते हैं उसके लिए सबसे उपयुक्त है। यदि मैं उत्पादन परिवेश में लॉगिंग को अक्षम कर दूंगा और अपने ऐप में केवल मूल लॉगिंग करूंगा, तो मैं एक पूर्ण रूपरेखा स्विच नहीं करूंगा। हालाँकि यदि आप लॉगिंग के साथ थोड़ा अधिक करते हैं तो केवल उन विशेषताओं को देखें जो फ्रेमवर्क और उनके डेवलपर्स द्वारा प्रदान की गई हैं। जब आप QOS के माध्यम से लॉगबैक के लिए व्यावसायिक समर्थन प्राप्त करते हैं (मैंने सुना है) वर्तमान में Log4j 2 के लिए कोई व्यावसायिक समर्थन नहीं है। दूसरी तरफ, यदि आपको ऑडिट लॉगिंग करने की आवश्यकता है और async एपेंडर्स द्वारा प्रदान किए गए उच्च प्रदर्शन की आवश्यकता है तो यह बहुत मायने रखता है। check log4j 2

कृपया ध्यान दें कि वे सभी सुविधा प्रदान करने के बावजूद, facades हमेशा थोड़ा प्रदर्शन करते हैं। यह शायद आपको बिल्कुल प्रभावित नहीं कर रहा है, लेकिन यदि आप कम संसाधनों पर हैं, तो आपको अपने पास मौजूद हर चीज को बचाने की आवश्यकता हो सकती है।

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

अस्वीकरण: मैं वर्तमान में VP, Apache लॉगिंग सेवाएँ और log4j में शामिल हूं।


19

आपके प्रश्न का ठीक-ठीक उत्तर नहीं दे रहा है, लेकिन यदि आप अपने स्व-निर्मित आवरण से दूर जा सकते हैं तो जावा (SLF4J) के लिए सरल लॉगिंग मुखौटा है जिसे अब हाइबरनेट (कॉमन्स लॉगिंग के बजाय) बदल दिया गया है।

SLF4J जकार्ता कॉमन्स लॉगिंग (JCL) के साथ देखे गए किसी भी वर्ग लोडर समस्या या मेमोरी लीक से ग्रस्त नहीं है।

SLF4J JDK लॉगिंग, log4j और लॉगबैक का समर्थन करता है। तो फिर समय सही होने पर लॉग 4 जे से लॉगबैक पर स्विच करना काफी आसान होना चाहिए।

संपादित करें: अपने आप को स्पष्ट नहीं करने वाली आपत्तियाँ। मैं SLF4J का उपयोग करने का सुझाव दे रहा था ताकि खुद को log4j या logback के बीच एक कठिन चुनाव करने से अलग कर सकूं।


3
मैं SLF4J जानता हूं। लेकिन मैं मुखौटा के लिए नहीं लॉगिंग रूपरेखा के लिए कहा!

4
क्षमा याचना। मैं क्या सुझाव दे रहा था कि यदि आप अपने स्वयं के कस्टम मुखौटा के बजाय SLF4J का उपयोग कर रहे थे, तो log4j से लॉगबैक पर स्विच करना कम दर्दनाक होगा?
टूलकिट

उस प्रशस्ति पत्र का स्रोत क्या है? कॉमन्स लॉगिंग एक आजमाया और परखा हुआ घटक है। मैंने इसके साथ कभी कोई मेमोरी लीक नहीं की है।
क्षितिज शर्मा

1
@KshitizSharma - SLF4J प्रलेखन लिंक मैंने प्रदान किया: slf4j.org/manual.html
टूलकिट

13

आपका निर्णय आधारित होना चाहिए

  • इन "अधिक सुविधाओं" के लिए आपकी वास्तविक आवश्यकता; तथा
  • परिवर्तन को लागू करने की आपकी अपेक्षित लागत।

आपको एपीआई को बदलने का आग्रह सिर्फ इसलिए करना चाहिए क्योंकि यह "नया, बेहतर, बेहतर है।" मैं "अगर यह टूटा नहीं है, तो इसे लात मत मारो" की नीति का पालन करें।

यदि आपके एप्लिकेशन को बहुत परिष्कृत लॉगिंग फ़्रेमवर्क की आवश्यकता है, तो आप इस पर विचार करना चाह सकते हैं।


3

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

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