slf4j में कोई जादू नहीं है। प्रवेश के साथ समस्या यह है कि अगर आप कहते हैं
logger.debug("expensive string representation: " + godObject)
तो कोई फर्क नहीं पड़ता अगर डिबग स्तर लकड़हारा में सक्षम किया गया था या नहीं, आप हमेशा godObject.toString()
का मूल्यांकन किया जो एक महंगी आपरेशन किया जा सकता है जाने के लिए लॉग इन करना चाहता था हुआ करता था, और उसके बाद स्ट्रिंग कॉन्सटेनेशन भी। यह केवल इस तथ्य से आता है कि जावा (और अधिकतर भाषाओं) तर्कों का मूल्यांकन किसी फ़ंक्शन में पारित होने से पहले किया जाता है।
यही कारण है कि slf4j ने logger.debug(String msg, Object arg)
(और अधिक तर्कों के लिए अन्य रूप) प्रस्तुत किए। पूरा विचार यह है कि आप debug
फ़ंक्शन पर सस्ते तर्क देते हैं और यह toString
पर उन पर कॉल करता है और डीबग स्तर चालू होने पर उन्हें केवल एक संदेश में जोड़ता है।
ध्यान दें कि
logger.debug("expensive string representation, eg: {}", godObject.toString());
फोन करके आप काफी यह लाभ को कम करने, इस तरह से आप परिवर्तित godObject
हर समय के रूप में, इससे पहले कि आप debug
के पास, कोई बात नहीं क्या डिबग स्तर पर है। आप केवल
logger.debug("expensive string representation, eg: {}", godObject);
का उपयोग करना चाहिए बहरहाल, यह अभी आदर्श नहीं है। यह केवल toString
और स्ट्रिंग कॉन्सटेनेशन को कॉल करने की अनुमति देता है। लेकिन अगर आपके लॉगिंग संदेश को संदेश बनाने के लिए कुछ अन्य महंगी प्रसंस्करण की आवश्यकता है, तो इससे मदद नहीं मिलेगी।जैसा आप संदेश बनाने के लिए कुछ expensiveMethod
कॉल करने के लिए की जरूरत है:
logger.debug("expensive method, eg: {}",
godObject.expensiveMethod());
तो expensiveMethod
हमेशा logger
को पास किए जाने से पहले मूल्यांकन किया जाता है। कुशलतापूर्वक slf4j के साथ इस काम करने के लिए, आप अभी भी
if (logger.isDebugEnabled())
logger.debug("expensive method, eg: {}",
godObject.expensiveMethod());
वापस करने के लिए सहारा है स्काला के कॉल-दर-नाम इस मामले में एक बहुत मदद करता है, क्योंकि यह आपको एक समारोह वस्तु में कोड की मनमानी टुकड़ा लपेट और करने की अनुमति देता आवश्यकता होने पर केवल उस कोड का मूल्यांकन करें। यह वही है जो हमें चाहिए। उदाहरण के लिए, slf4s पर एक नज़र डालें। इस पुस्तकालय slf4j के Logger
में क्यों की तरह कोई तर्क
def debug(msg: => String) { ... }
तरह के तरीकों को उजागर करता है? क्योंकि हमें अब उनकी आवश्यकता नहीं है। हम सिर्फ
logger.debug("expensive representation, eg: " +
godObject.expensiveMethod())
हम संदेश और अपने तर्कों में उत्तीर्ण नहीं लिख सकते हैं, हम सीधे कोड का एक टुकड़ा है कि संदेश के लिए मूल्यांकन किया जाता है गुजरती हैं। लेकिन केवल अगर लॉगर ऐसा करने का फैसला करता है। यदि डीबग स्तर चालू नहीं है, तो logger.debug(...)
के भीतर कुछ भी मूल्यांकन नहीं किया गया है, पूरी बात बस छोड़ दी गई है। न तो expensiveMethod
कहा जाता है और न ही toString
कॉल या स्ट्रिंग कॉन्सटेनेशन होता है। तो यह दृष्टिकोण सबसे सामान्य और सबसे लचीला है। आप किसी भी अभिव्यक्ति को String
से debug
पर मूल्यांकन कर सकते हैं, इससे कोई फर्क नहीं पड़ता कि यह कितना जटिल है।
क्रिस्टल स्पष्ट, बहुत बहुत धन्यवाद। मुझे लगता है कि आपकी पूरी व्याख्या उस जादू के लिए तैयार होती है जिसे मैं उम्मीद कर रहा था और नहीं मिला था। :) – teo