2017-01-13 20 views
11

के साथ इसका उपयोग करते हैं तो हम log4j2 की सभी सुविधाओं का उपयोग कर सकते हैं। हमने जेनेरिक एपिस का उपयोग करने के लिए slf4 apis का उपयोग करने के लिए हमारे सभी कोड माइग्रेट कर दिए हैं, हालांकि अब हम log4j 1.x से log4j 2.x में अपग्रेड करने की सोच रहे हैं । क्या हम log4j2 की सभी सुविधाओं का उपयोग करने में सक्षम होंगे अगर हम sl44 api और कार्यान्वयन log4j2 के रूप में उपयोग करते हैं?यदि हम slf4j api

उत्तर

26

Log4j2 एपीआई SLF4J एपीआई से अमीर है, और कई Log4j2 एपीआई सुविधाओं SLF4J के माध्यम से सुलभ नहीं हैं। विवरण के लिए नीचे देखें।

लॉग 4j2 कार्यान्वयन की विशेषताएं, जैसे असिंक लॉगर्स, लुकअप, फ़िल्टर, लेआउट और परिशिष्ट कॉन्फ़िगरेशन के साथ नियंत्रित होते हैं और आपके एप्लिकेशन में उपयोग किए जाने वाले लॉगिंग एपीआई के बावजूद उपलब्ध हैं।

के विभिन्न लेकिन संबंधित प्रश्नों के लिए कृपया answer को भी देखें, यह लॉग 4j2 API पर प्रोग्राम करने के लिए सुरक्षित क्यों है।

10 Log4j2 एपीआई SLF4J में उपलब्ध नहीं सुविधाएँ

(1) Message API अनुप्रयोगों केवल पाठ के अलावा संरचित वस्तुओं लॉग इन करने की अनुमति देता है। आंतरिक रूप से Log4j2 किसी संदेश में लॉग इन की गई सभी चीज़ों को परिवर्तित करता है, और इसे एपीआई में उजागर करने के लिए अनुप्रयोगों के लिए डाउनस्ट्रीम लॉगिंग घटकों (फ़िल्टर, लेआउट, एपेंडर) के साथ बातचीत करने के लिए सभी प्रकार की संभावनाएं खुलती हैं। यह उपयोगी हो सकता है यदि आप कस्टम घटक को Log4j2 के प्लगइन के रूप में विकसित कर रहे हैं, साथ ही जब आप अंतर्निर्मित लोगों का उपयोग कर रहे हों। एक अंतर्निहित उदाहरण के लिए, StructuredDataMessage का उपयोग Rfc5424Layout पर ठीक-ठीक नियंत्रण के लिए किया जाता है।

(2) जावा 8 lambda support आपको अनुरोधपूर्वक लॉग स्तर सक्षम होने पर स्पष्ट रूप से जांच किए बिना पैरामीटर बनाने या संदेशों को लॉग इन करने की अनुमति देता है।

// Java-8 style optimization: no need to explicitly check the log level: 
// the lambda expression is not evaluated if the TRACE level is not enabled 
logger.trace("Some long-running operation returned {}",() -> expensiveOperation()); 

(3) मिश्रण {} स्ट्रिंग के साथ शैली मापदंडों :: प्रारूप %s %d शैली मानकों। {} शैली में बेहतर प्रदर्शन होता है और इसका उपयोग किसी भी पैरामीटर प्रकार के साथ किया जा सकता है, लेकिन printf शैली प्रारूपण पर ठीक दाग नियंत्रण प्रदान करती है। Log4j2 आपको इन पैरामीटर शैलियों को आसानी से मिश्रण करने की अनुमति देता है। उदाहरण के लिए:

logger.debug("Opening connection to {}...", someDataSource); 
logger.printf(Level.INFO, "Logging in user %1$s with birthday %2$tm %2$te,%2$tY", user.getName(), user.getBirthdayCalendar()); 

(4) CloseableThreadContext SLF4J में सामान्य ThreadContext (MDC) पर कुछ अतिरिक्त सुविधा प्रदान करता है: यह स्वचालित रूप से आइटम को हटा आपका काम पूरा हो। उदाहरण के लिए:

// Add to the ThreadContext map for this try block only; 
try (final CloseableThreadContext.Instance ctc = CloseableThreadContext 
     .put("id", UUID.randomUUID().toString()) 
     .put("loginId", session.getAttribute("loginId"))) { 
    logger.debug("Message 1"); 
    // call some other code that also does logging 
    ... 
    logger.debug("Message 2"); 
    ... 
} // "is" and "loginId" are now removed from the ThreadContext map 

(5) Log4j2 के ThreadContext, कुंजी-मान जोड़ों के अलावा, यह भी push और pop तरीकों ढेर कार्यक्षमता (क्या log4j 1 में एनडीसी कहा जाता था) का समर्थन किया है।

(6) SLF4J FATAL लॉग स्तर का समर्थन नहीं करता है।

(7) Log4j2 custom log levels के लिए समर्थन है। इन्हें log विधियों के साथ उपयोग किया जा सकता है, उदाहरण के लिए: logger.log(Level.getLevel("FINE"), "... msg"), या आप अपने कस्टम लॉग स्तर के लिए सुविधा विधियों के साथ एक कस्टम लॉगर रैपर उत्पन्न कर सकते हैं।

(8) Log4j2 API किसी भी ऑब्जेक्ट को स्वीकार करता है, केवल स्ट्रिंग्स नहीं। यह उन चीजों में से एक है जो Log4j2 को "garbage-free" होने की अनुमति देते हैं, जिसका अर्थ है कि यह नए ऑब्जेक्ट्स को आवंटित करने से बच जाएगा। आपका ऑब्जेक्ट किसी भी अस्थायी स्ट्रिंग्स के बिना लॉग इन किया गया है यदि यह संख्या है, एक CharSequence या जब यह (Log4j2) स्ट्रिंगबिल्डर Formattable इंटरफ़ेस लागू करता है।

लॉग 4j2 एपीआई अगर आप 10 पैरामीटर या उससे कम लॉग इन करते हैं तो vararg arrays बनाने से भी बचेंगे। यदि आप 2 से अधिक पैरामीटर लॉग करते हैं तो SLF4J vararg arrays बनाता है।

(9) उपरोक्त आप सीधे लॉग 4j2 एपीआई का उपयोग करके मुफ्त में आते हैं। उस पर, यदि आप वास्तव में अस्थायी वस्तुओं (जैसे कुछ इंटरैक्टिव गेम और कम विलंबता वित्तीय अनुप्रयोग करते हैं) बनाने से बचने की परवाह करते हैं, तो आप Unbox उपयोगिता वर्ग के साथ ऑटो-मुक्केबाजी आदिम पैरामीटर से बच सकते हैं।

(10) एसएलएफ 4 जे मार्करों के मोटे अनाज वाले सिंक्रनाइज़ेशन के उपयोग से बहु-थ्रेडेड अनुप्रयोगों (SLF4J-240) के लिए प्रदर्शन प्रभाव हो सकता है। इस performance test results पृष्ठ का उन्नत फ़िल्टरिंग अनुभाग देखें।


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

+0

धन्यवाद सभी आईपी के लिए रेमो। अंक जो आपने इंगित किया है। – Mayur

+0

कृपया ध्यान दें कि एसएलएफ 4 जे -240 अंततः तय किया गया था और एसएलएफ 4 जे 1.7.24 में होगा। अस्वीकरण - मैं Log4j 2 में भी योगदान देता हूं। – rgoers

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