अपने आवेदन में, मैं पीएमडी के माध्यम से अपना कोड चला रहा हूं। यह संदेश मुझे दिखाता है:
- प्रिंटस्टैकट्रेस () से बचें; इसके बजाय एक लकड़हारा कॉल का उपयोग करें।
इसका क्या मतलब है?
अपने आवेदन में, मैं पीएमडी के माध्यम से अपना कोड चला रहा हूं। यह संदेश मुझे दिखाता है:
- प्रिंटस्टैकट्रेस () से बचें; इसके बजाय एक लकड़हारा कॉल का उपयोग करें।
इसका क्या मतलब है?
जवाबों:
इसका मतलब है कि आपको लॉगिंग ढांचे का उपयोग करना चाहिए logback या log4j और सीधे मुद्रण अपवादों के बजाय:
e.printStackTrace();
आपको इस फ्रेमवर्क एपीआई का उपयोग करके उन्हें लॉग इन करना चाहिए:
log.error("Ops!", e);
लॉगिंग फ्रेमवर्क आपको बहुत अधिक लचीलापन देते हैं, जैसे आप चुन सकते हैं कि आप कंसोल या फ़ाइल में लॉग इन करना चाहते हैं - या शायद कुछ संदेश छोड़ दें यदि आप उन्हें कुछ वातावरण में प्रासंगिक नहीं पाते हैं।
यदि आप printStackTrace()
एक अपवाद पर कॉल करते हैं, तो ट्रेस को लिखा जाता है System.err
और इसे कहीं और रूट करना मुश्किल है (या इसे फ़िल्टर करें)। ऐसा करने के बजाय आपको लॉगिंग फ्रेमवर्क (या अपाचे कॉमन्स लॉगिंग जैसे कई लॉगिंग फ्रेमवर्क के आसपास एक आवरण) का उपयोग करने की सलाह दी जाती है और उस फ्रेमवर्क (जैसे logger.error("some exception message", e)
) का उपयोग करके अपवाद लॉग करें ।
ऐसा करना जो आपको अनुमति देता है:
त्रुटियों और अन्य निदानों की रिपोर्ट करने के लिए एक उत्पादन गुणवत्ता कार्यक्रम को कई लॉगिंग विकल्पों (जैसे log4j, logback, java.util.log) में से एक का उपयोग करना चाहिए। इसके कई फायदे हैं:
इसके विपरीत, यदि आप सिर्फ प्रिंटस्टैकट्रेस का उपयोग करते हैं, तो तैनातीकर्ता / अंत उपयोगकर्ता के पास कोई नियंत्रण नहीं है, और लॉगिंग संदेश अनुचित परिस्थितियों में या तो खो जाने या अंतिम उपयोगकर्ता को दिखाए जाने के लिए उत्तरदायी हैं। (और कुछ भी नहीं एक यादृच्छिक स्टैक ट्रेस से अधिक डरपोक उपयोगकर्ता को भयभीत करता है।)
लगभग हर लॉगिंग फ्रेमवर्क एक ऐसी विधि प्रदान करता है जिसमें हम एक संदेश के साथ फेंकने योग्य वस्तु को पास कर सकते हैं। पसंद:
public trace(Marker marker, String msg, Throwable t);
वे फेंकने योग्य वस्तु के स्टैकट्रेस को प्रिंट करते हैं।
कंपनी कॉन्सेप्ट से बात करते हैं। लॉग आपको लचीला स्तर देता है ( logger.info और logger.debug के बीच अंतर देखें )। अलग-अलग लोग अलग-अलग स्तर देखना चाहते हैं, जैसे क्यूएएस, डेवलपर्स, बिजनेस लोग। लेकिन e.printStackTrace () सब कुछ प्रिंट कर लेगा। इसके अलावा, जैसे कि इस विधि को आराम से बुलाया जाएगा, यह एक ही त्रुटि कई बार मुद्रित हो सकती है। तब आपकी कंपनी में Devops या Tech-Ops लोग पागल हो सकते हैं क्योंकि उन्हें एक ही त्रुटि अनुस्मारक प्राप्त होगा। मुझे लगता है कि एक बेहतर प्रतिस्थापन log.error("errors happend in XXX", e)
यह हो सकता है यह पूरी जानकारी भी प्रिंट कर लेगा जो e.printStackTrace () की तुलना में आसान है
मुख्य कारण यह है कि प्रोगार्ड लॉग कॉल को उत्पादन से हटा देगा। क्योंकि StackTrace को लॉग इन या प्रिंट करके, उन्हें एंड्रॉइड फोन के अंदर (स्टैक ट्रेस या लॉग के अंदर की जानकारी) देखना संभव है, उदाहरण के लिए Logcat Reader एप्लिकेशन। ताकि यह सुरक्षा के लिए बुरा व्यवहार हो। इसके अलावा, हम उन्हें उत्पादन के दौरान एक्सेस नहीं करते हैं, उत्पादन से हटा दिया जाना बेहतर होगा। चूंकि ProGuard सभी लॉग कॉल को हटाता है, स्टैकट्रेस नहीं, इसलिए लॉग इन कैच ब्लॉक्स का उपयोग करना बेहतर है और उन्हें प्रोडगार्ड से प्रोडक्शन से हटा दिया जाए।