यह log4j2 के साथ slf4j का उपयोग करने के लिए लायक है


114

मैं तय नहीं कर पा रहा हूं कि slf4j का उपयोग करें या नहीं log4j2 के साथ। ऑनलाइन पोस्ट के आधार पर, ऐसा नहीं लगता है कि इसमें कोई प्रदर्शन हिट होगा, लेकिन क्या यह वास्तव में आवश्यक है।

इसके अलावा ये अंक log4j2 के पक्ष में शासन करते हैं:

  • SLF4J स्ट्रिंग्स को लॉग करने के लिए आपके एप्लिकेशन को मजबूर करता है। यदि आप लॉग इन करना चाहते हैं, तो Log4j 2 API किसी भी CharSequence को लॉगिंग करने का समर्थन करता है, लेकिन किसी भी ऑब्जेक्ट को लॉगिंग का भी समर्थन करता है।
  • Log4j 2 API मैसेजिंग ऑब्जेक्ट्स, जावा 8 लैम्ब्डा एक्सप्रेशन और कचरा-मुक्त लॉगिंग के लिए समर्थन प्रदान करता है (यह वेरगेज एरे को बनाने से बचता है और चार्जेसेंस ऑब्जेक्ट्स को लॉग करते समय स्ट्रिंग्स बनाने से बचता है)।

2
शायद। क्या होगा यदि मेरा एप्लिकेशन सर्वर शामिल है slf4jऔर लॉगबैक (या log4jv1)? क्या मुझे आपके आवेदन का उपयोग करने के लिए तीसरे लकड़हारे को स्थापित करने के लिए मजबूर होना चाहिए? या हो सकता है कि कॉर्पोरेट सुरक्षा का फैसला आप केवल java.util.loggingउत्पादन में उपयोग कर सकते हैं , तब क्या?
इलियट फ्रिश

लिखने के लिए धन्यवाद्। लेकिन, अगर हर एक log4j org का उपयोग कर रहा है, तो उपरोक्त तर्क मान्य नहीं होगा।
एंडी And। And

4
SLF4J का उपयोग करने का मतलब है कि कंपनी की नीति में बदलाव करने पर कार्यान्वयन को बदलना बहुत आसान है, जैसे कि जब आपकी कंपनी का अधिग्रहण किया जाता है और नई नीतियां आपको मजबूर करती हैं। अब SLF4J का उपयोग करते हुए, जब आप कोड लिखते हैं, तो सीधे Log4j का उपयोग करने से अधिक समय नहीं लगेगा। बाद में सीधे Log4j कॉल को बदलने में बहुत समय लगेगा। SLF4J भविष्य के लिए एक नि: शुल्क निवेश / बीमा है। क्या यह Log4j 2 एपीआई सुविधाओं से अधिक महत्वपूर्ण है? केवल आप (या कंपनी नीति) ही यह तय कर सकते हैं।
एंड्रियास

वहाँ भी अगर आप चाहते थे log4j2 के साथ slf4j उपयोग करने के लिए एक रास्ता है? यह पृष्ठ लॉग 4j के साथ उपयोग दिखाता है - संस्करण 1.2 - जो जीवन का अंत है), लेकिन लॉग 4 जे 2 के लिए कोई विकल्प नहीं है। अगर कोई रास्ता है, तो slf4j इसका उल्लेख क्यों नहीं करता है?
जे वुडचुक

जवाबों:


162

आगे बढ़ो: slf4j के बजाय log4j2 एपीआई के लिए कार्यक्रम

यह सुरक्षित है: Log4j2 एपीआई slf4j के रूप में सटीक गारंटी प्रदान करता है - और अधिक।

अब जब Log4j2 खुद ही एक एपीआई और एक कार्यान्वयन मॉड्यूल में अलग हो गया है, तो SLF4J का उपयोग करने में कोई मूल्य नहीं है।

हां, अपने विकल्पों को खुला रखना अच्छा इंजीनियरिंग अभ्यास है। आप बाद में किसी अन्य लॉगिंग कार्यान्वयन में बदलना चाहते हैं।

पिछले 10 वर्षों से, आपके एप्लिकेशन में इस तरह के लचीलेपन के निर्माण का मतलब SLF4J जैसे रैपर एपीआई का उपयोग करना है। यह लचीलापन हालांकि मुफ्त में नहीं आता है: इस दृष्टिकोण का नुकसान यह है कि आपका एप्लिकेशन अंतर्निहित लॉगिंग लाइब्रेरी के समृद्ध सुविधा सेट का उपयोग नहीं कर सकता है।

Log4j2 एक समाधान प्रदान करता है जिसके लिए यह आवश्यक नहीं है कि आपका आवेदन सबसे कम आम भाजक तक सीमित हो।

एस्केप वाल्व: log4j-to-slf4j

Log4j2 में एक log4j-to-slf4jब्रिज मॉड्यूल शामिल है । Log4j2 एपीआई के खिलाफ कोड किए गए किसी भी एप्लिकेशन को किसी भी समय किसी भी slf4j-अनुरूप कार्यान्वयन के लिए बैकिंग कार्यान्वयन को स्विच करने का विकल्प चुन सकते हैं।

log4j करने वाली slf4j

जैसा कि सवाल में कहा गया है, Log4j2 API का उपयोग करना सीधे अधिक कार्यक्षमता प्रदान करता है और इसमें कुछ गैर-कार्यात्मक फायदे हैं जैसे कि slf4j जैसे रैपर एपीआई का उपयोग करना:

  • संदेश एपीआई
  • आलसी लॉगिंग के लिए लैम्ब्डा
  • केवल स्ट्रिंग्स के बजाय किसी भी ऑब्जेक्ट को लॉग करें
  • कचरा-मुक्त: जहाँ भी संभव हो, वेरगेज बनाने या स्ट्रिंग्स बनाने से बचें
  • जब आप उनके साथ समाप्त हो जाते हैं, तब CloseableThreadContext MDC से आइटम स्वचालित रूप से हटा देता है

( अधिक जानकारी के लिए SLF4J में उपलब्ध 10 लॉग 4j2 एपीआई सुविधाएँ देखें।)

अनुप्रयोग सुरक्षित रूप से Log4j2 API की इन समृद्ध विशेषताओं का उपयोग मूल लॉग 4j2 कोर कार्यान्वयन के लिए बंद किए बिना कर सकते हैं।

SLF4J अभी भी आपका सुरक्षा वाल्व है, इसका मतलब यह नहीं है कि आपके आवेदन को अब SLF4J API के विरुद्ध कोड होना चाहिए।


प्रकटीकरण: मैं Log4j2 में योगदान देता हूं।


अद्यतन: वहाँ कुछ भ्रम है कि Log4j2 एपीआई के लिए प्रोग्रामिंग किसी भी तरह "एक मुखौटा के लिए मुखौटा" पेश करता है। इस संबंध में Log4j2 एपीआई और SLF4J के बीच कोई अंतर नहीं है।

मूल कार्यान्वयन का उपयोग करते समय दोनों APIs को 2 निर्भरता की आवश्यकता होती है, और गैर-देशी कार्यान्वयन के लिए 4 निर्भरता। SLF4J और Log4j2 API इस संबंध में समान हैं। उदाहरण के लिए:

आवश्यक निर्भरताएँ SLF4J और Log4j 2 API के लिए समान हैं


7
मै समझता हुँ। मुझे मेरे प्रश्न का उत्तर दें। क्या log4j2 के अलावा log4j2 API का कोई स्वतंत्र कार्यान्वयन है?
सेकी

5
Log4j2 एपीआई और impl कर रहे हैं नहीं "कसकर युग्मित"। ये सभी SLF4J कार्यान्वयन सभी उपलब्ध हैं: Log4j2 एपीआई के खिलाफ कोडित एक कोड log4j-to-slf4jइसके बजाय निर्भरता का चयन कर सकता है log4j-coreऔर आपके द्वारा उल्लिखित इनमें से कोई भी SLF4J कार्यान्वयन चुन सकता है। Log4j2 एपीआई के मूल कार्यान्वयन की संख्या अप्रासंगिक है।
रेम्को पोपमा

19
समस्या यह है कि आपके पास अक्सर पुस्तकालयों पर निर्भरता होती है जो स्वयं slf4j का उपयोग करते हैं, इसलिए यह सिर्फ उसी के साथ रहना आसान है।
दावियो

18
इसलिए, मुझे कार्यान्वयन के लिए इंटरफ़ेस के लिए इंटरफ़ेस का उपयोग करना चाहिए? हाँ, नहीं धन्यवाद ... Slf4j ने log4j को लॉगिंग के लिए एक अच्छा इंटरफ़ेस प्रदान करके पंच को हरा दिया ... log4j2 को बस slf4j एपीआई को लागू करना चाहिए - यदि कोई अनुपलब्ध सुविधा है, तो इसे वापस योगदान करें, यदि slf4j नया नहीं लेगा सुविधा, तो MAYBE वहाँ log4j2 एपीआई इंटरफेस के लिए एक मामला है ....
RockMeetHardplace

4
@RemkoPopma - आप अभी भी log4j इंटरफ़ेस का उपयोग करने के खिलाफ वकालत कर रहे हैं। हां, मुझे यह मिल गया है - मैं log4j2 के इंटरफ़ेस को चेन कर सकता हूं -> slf4j का इंटरफ़ेस -> जो भी कार्यान्वयन हो, लेकिन मैं सिर्फ अमूर्तता को अमूर्त नहीं करूंगा - धन्यवाद लेकिन कोई धन्यवाद नहीं।
रॉकमेटहार्डप्ले
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.