2012-04-27 7 views
23

मैं हमेशा निम्नलिखित पैटर्न का उपयोग किया है (SLF4J) वालों के निर्माण के लिए:स्थैतिक बनाम गैर स्थैतिक संदर्भों में SLF4J लॉगर्स बनाने का ओवरहेड क्या है?

private static final Logger log = LoggerFactory.getLogger(MyClass.class); 

यह अब तक काम किया है, लेकिन मैं कुछ बिंदु पर static संदर्भ और ठोस कक्षा में पारित करने के लिए जरूरत के बारे में सोच रहा था शाब्दिक सभी बजाय जैसे

private final Logger log = LoggerFactory.getLogger(getClass()); 

यह मूलतः कहा गया है (और जवाब) एक गैर स्थिर लकड़हारा का उपयोग करने का समय log4j

के लिए यहां से पहले

Should logger be private static or not

और यहाँ

Should be logger always final and static?

मैं final एहसास मूल रूप से अनिवार्य है, तो मैं सोच रहा छोड़ दिया हूँ कैसे उच्च गैर स्थिर संदर्भ में SLF4J के उपयोग करने का भूमि के ऊपर वास्तव में है।

प्रश्न:

कोई महत्वपूर्ण व्यावहारिक

private final Logger log = LoggerFactory.getLogger(getClass()); 

का उपयोग करने का

private static final Logger log = LoggerFactory.getLogger(MyClass.class); 

से अधिक औसत (वेब) अनुप्रयोग में भूमि के ऊपर है? (कोई जरूरत नहीं "के बारे में बात करने के लिए" उच्च अंत, भारी लोड यहां वेब ऐप्लिकेशन)


ध्यान दें, मैं अंत में CDI का उपयोग कर एक और भी अच्छे दृष्टिकोण का उपयोग करने

@Inject private final Logger log; 
की तरह एक SLF4J लकड़हारा प्राप्त करने के लिए योजना बना रहा हूँ

जैसा कि यहां वर्णित है http://www.seamframework.org/Weld/PortableExtensionsPackage#H-TtLoggerttInjection, लेकिन मुझे पहले लॉगर कैशिंग के बारे में जानने की आवश्यकता है।

उप प्रश्न: यह भी संभव है उपयोग करने के लिए ?:

@Inject private static final Logger log; 

(सिर्फ CDI के साथ शुरुआत ईमानदार होना)

+3

ध्यान रखें, अगर आप 'getClass()' का उपयोग करते हैं तो लॉगर नाम/श्रेणी उप-वर्गों की उपस्थिति में अप्रत्याशित रूप से बदल सकती है। – Thilo

+0

धन्यवाद। मैं वास्तव में यहां एक "लॉगर निर्माण पैटर्न" ढूंढ रहा हूं, लेकिन मुझे यह मानना ​​है कि मैं अपने स्वयं के उपयोग के मामले के बारे में 100% निश्चित नहीं हूं, यह है कि क्या मैं संभव उप वर्गों को अपने स्वयं के लॉगर्स प्राप्त करना चाहता हूं या यदि मैं चाहता हूं एक साझा सुपर क्लास से एक का पुन: उपयोग करने के लिए। : -/ – Kawu

+0

यदि आप [jcabi-log] (http://www.jcabi.com/jcabi-log/) का उपयोग करते हैं, तो आप इस चर से छुटकारा पा सकते हैं, slf4j – yegor256

उत्तर

21

गैर स्थैतिक (उदाहरण) लॉगर चर के लिए ओवरहेड नगण्य होना चाहिए, जब तक कि 10000 या उससे अधिक नहीं कहें, तत्कालियां होती हैं। यहां मुख्य शब्द नगण्य है। यदि कई (> 10000) ऑब्जेक्ट्स तत्काल हैं, तो प्रभाव शायद मापने योग्य होगा लेकिन फिर भी कम होगा।

अधिक विशेष रूप से, एक उदाहरण लॉगर प्रति ऑब्जेक्ट उदाहरण के संदर्भ में एक संदर्भ (64 बिट्स) द्वारा स्मृति पदचिह्न को बढ़ाता है। सीपीयू तरफ, लागत प्रति उदाहरण एक हैश दिखती है, यानी हैश टेबल (छोटे) में उपयुक्त लॉगर को देखने की लागत। दोबारा, दोनों लागत नगण्य होनी चाहिए जब तक कि कई सारी वस्तुएं नहीं बनाई जातीं।

इस प्रश्न पर भी SLF4J FAQ में चर्चा की गई है।

+0

इंजेक्शन प्रक्रिया/लुकअप शामिल के बारे में क्या? वहाँ कोई नकारात्मक है? – Kawu

+0

मेरा अद्यतन उत्तर देखें। – Ceki

2

मैं जब LoggerFactory का उपयोग कर सही ओवरहेड बारे में निश्चित नहीं हूँ, लेकिन मैं यह शक आपके आवेदन प्रदर्शन को प्रभावित करेगा। इसलिए जब आप फिट देखते हैं तो बस स्थिर या गैर स्थिर का उपयोग करें।

@Inject का उपयोग करने का लाभ क्या होना चाहिए। LoggerFactory पहले से ही ठोस इंक से प्रदान करता है और abstraction। किसी भी मामले में यह LoggerFactory से बहुत धीमी होगी।

जब आप @Inject का उपयोग करते हैं तो वाक्यविन्यास अधिक संक्षिप्त होता है। लेकिन कल्पना करें कि आप कक्षा में एक परीक्षण में उपयोग करते हैं। फिर आपको लॉगिंग प्राप्त करने के लिए इंजेक्शन सेट करना होगा। सामान्य लॉगर फैक्ट्री के साथ यह परीक्षणों में अच्छी तरह से काम करता है। अगर जावा के पास @ इंजेक्ट के लिए एक सामान्य तंत्र था तो यह बहुत अच्छा काम करेगा, लेकिन यह सेटअप अधिक कठिन है।

+0

के आस-पास एक स्थिर रैपर यह एक और चीज नहीं है इस पर ध्यान देने के लिए: यदि आप मूल रूप से '@ इंजेक्ट प्राइवेट फाइनल लॉगर लॉग का उपयोग कर सकते हैं; 'मुझे' निजी स्थैतिक अंतिम लॉगर लॉग = लॉगरफ़ैक्टरी.getLogger (MyClass.class) का उपयोग क्यों करना चाहिए;' (ज्यादातर ओवरहेड को नोटिस करने में सक्षम नहीं है जैसा कि केकी ने कहा)? – Kawu

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