हाँ, लॉग बयान अभी भी निष्पादित किया जाएगा। यही कारण है कि यह पहली बार लॉग स्तर की जांच के लिए एक अच्छा पैटर्न है: जैसे
if (log.isInfoEnabled()) {
log.info("My big long info string: " + someMessage);
}
कुछ यह जानकारी String
के लिए अंतरिक्ष पुनः दिए जब लॉग स्तर INFO
बयान का समर्थन नहीं करता से रखने के लिए है।
यह कुछ भी नहीं है #ifdef
- #ifdef
एक संकलक निर्देश है, जबकि Log4J कॉन्फ़िगरेशन रनटाइम पर संसाधित होते हैं।
संपादित करें: मुझे अज्ञानता के कारण कमजोर होने से नफरत है, इसलिए यहां एक लेख मेरा जवाब का समर्थन कर रहा है।
http://surguy.net/articles/removing-log-messages.xml से
:
Log4J में, यदि आप डीबग स्तर पर संदेश लॉग इन करें, और केवल जानकारी स्तर के संदेशों लॉग इन करने की वर्तमान appender सेट किया गया है और इसके बाद के संस्करण है, तो संदेश नहीं होगा प्रदर्शित हों। प्रदर्शन विधि लॉग विधि को कॉल करने के लिए दंड न्यूनतम है - कुछ नैनोसेकंड। हालांकि, में विधि के तर्कों का मूल्यांकन करने में अधिक समय लग सकता है। उदाहरण के लिए:
logger.debug ("बड़ी वस्तु " + bigObject.toString());
largeObject.toString का मूल्यांकन() धीमा हो सकता है, और यह से पहले लकड़हारा करने के लिए कॉल का मूल्यांकन किया जाता है, तो लकड़हारा नहीं रोका जा सकता है कि यह मूल्यांकन किया जा रहा, भले ही यह उपयोग नहीं किया जाएगा।
संपादित 2: log4j मैनुअल ही (http://logging.apache.org/log4j/1.2/manual.html) से:
उपयोगकर्ता निम्न प्रदर्शन के मुद्दों के बारे में पता होना चाहिए।
लॉगिंग बंद होने पर लॉगिंग प्रदर्शन। जब लॉगिंग पूरी तरह से या केवल स्तरों के सेट के लिए बंद हो जाती है, तो लॉग अनुरोध की लागत में एक विधि आमंत्रण और एक पूर्णांक तुलना होती है। 233 मेगाहट्र्ज पेंटियम II मशीन पर यह लागत आमतौर पर 5 से 50 नैनोसेकंद रेंज में होती है।
हालांकि, विधि आमंत्रण में पैरामीटर निर्माण की "छिपी हुई" लागत शामिल है।
उदाहरण के लिए, कुछ लकड़हारा बिल्ली के लिए, लेखन,
logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));
, संदेश पैरामीटर, यानी निर्माण मैं और प्रवेश [i] एक स्ट्रिंग के लिए दोनों पूर्णांक परिवर्तित करने, और श्रृंखलाबद्ध मध्यवर्ती तार की लागत आती परवाह किए बिना क्या संदेश लॉग किया जाएगा या नहीं। पैरामीटर निर्माण की यह लागत काफी अधिक हो सकती है और यह शामिल पैरामीटर के आकार पर निर्भर करती है।
if(logger.isDebugEnabled() {
logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));
}
यह पैरामीटर निर्माण की लागत नहीं देना होगा यदि डिबगिंग अक्षम किया गया है:
पैरामीटर निर्माण लागत लिखने से बचने के लिए। दूसरी तरफ, अगर लॉगर डीबग-सक्षम है, तो यह मूल्यांकन करने की लागत से दोगुना होगा कि लॉगर सक्षम है या नहीं: एक बार डीबग में सक्षम और एक बार डीबग में। यह एक महत्वहीन ओवरहेड है क्योंकि लॉगर का मूल्यांकन वास्तव में लॉग इन करने में लगभग 1% लगता है।
असल में यदि आपके बयान में सभी बयान कथन को लपेटना अच्छा नहीं है। लॉगिंग जितना संभव हो उतना छोटा काम होना चाहिए, यही कारण है कि आपके पास लॉगिंग फ्रेमवर्क है। इसके अलावा यदि लॉग स्टेटमेंट (गलती से) का दुष्प्रभाव है तो आप रिलीज से अलग डीबग कर देंगे। केवल तभी जब आप इसे दस लाख बार करते हैं तो आपको if जोड़ना चाहिए। यह भी संभव है कि वीएम ने पहले से ही इस कोड को अनुकूलित किया है जिसका उपयोग कभी नहीं किया जाता है। (बीटीडब्ल्यू, जिस टिप्पणी का मूल्यांकन किया गया है वह निश्चित रूप से सही है) – Thirler
क्षमा करें, आप पूरी तरह से अनौपचारिक हैं। वीएम संभवतया इसे अनुकूलित नहीं कर सकता है, क्योंकि कथन प्रत्येक बार निष्पादित किया जाता है। प्रदर्शन प्रदर्शन के लिए आपको "दस लाख" लॉग स्टेटमेंट की आवश्यकता नहीं है, आपको बस एक लॉग इन स्टेटमेंट की आवश्यकता है जो लूप में है। और "लॉगिंग जितना संभव हो उतना कम काम होना चाहिए" इस संदर्भ में एक अर्थहीन बयान है - विशेष रूप से ओपी विशेष रूप से प्रदर्शन के बारे में पूछ रहा है। – danben
मैं कुछ मामलों में डैनबेन से सहमत हूं। यदि आप पंक्तियों में 10 लाइनों को बड़ी तारों (या जटिल toString()) के साथ लॉग इन करना चाहते हैं, तो उन्हें एक अच्छा विचार है, तो इसे लपेटना। मुझे नहीं लगता कि डाउनवोट योग्य था। – karoberts