2012-11-02 60 views
8

यहाँ दो बयान है कि आम तौर पर स्वीकार कर रहे हैं, लेकिन है कि मैं सच में खत्म नहीं मिल सकता है:slf4j में पैरामीटरेटेड लॉगिंग - यह स्कैला के उप-पैरामीटर से तुलना कैसे करता है?

1) स्काला के द्वारा नाम शान से जगह ले पैरामीटर कभी तो कष्टप्रद log4j उपयोग पैटर्न:

if (l.isDebugEnabled()) { 
     logger.debug("expensive string representation, eg: godObject.toString()") 
    } 

क्योंकि उप-नाम-पैरामीटर (स्कैला-विशिष्ट भाषा सुविधा) विधि आमंत्रण से पहले मूल्यांकन नहीं किया जाता है।

2) हालांकि, इस समस्या parametrized प्रवेश द्वारा slf4f में हल किया जाता है:

logger.debug("expensive string representation, eg {}:", godObject[.toString()]); 

तो, यह कैसे काम करता है? क्या slf4j लाइब्रेरी में कुछ निम्न स्तर का जादू शामिल है जो "डीबग" विधि निष्पादन से पहले पैरामीटर के मूल्यांकन को रोकता है? (क्या यह भी संभव है? लाइब्रेरी भाषा के इस तरह के मौलिक पहलू को प्रभावित कर सकता है?)

या क्या यह एक साधारण तथ्य है कि एक वस्तु स्ट्रिंग के बजाय विधि को पारित की जाती है? (और हो सकता है कि उस ऑब्जेक्ट का toString() डीबग() विधि में लागू हो, यदि लागू हो)।

लेकिन फिर, log4j के लिए भी यह सच नहीं है? (इसमें ऑब्जेक्ट पैरा के साथ विधियां हैं)। और इसका मतलब यह नहीं होगा कि यदि आप एक स्ट्रिंग पास करते हैं - जैसे ऊपर दिए गए कोड में - यह log4j के समान व्यवहार करेगा?

मुझे इस मामले पर कुछ हल्का शेड करना अच्छा लगेगा।

धन्यवाद!

उत्तर

24

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 पर मूल्यांकन कर सकते हैं, इससे कोई फर्क नहीं पड़ता कि यह कितना जटिल है।

+1

क्रिस्टल स्पष्ट, बहुत बहुत धन्यवाद। मुझे लगता है कि आपकी पूरी व्याख्या उस जादू के लिए तैयार होती है जिसे मैं उम्मीद कर रहा था और नहीं मिला था। :) – teo

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

  • कोई संबंधित समस्या नहीं^_^