प्रिंटस्टैकट्रेस () से बचें; इसके बजाय एक लकड़हारा कॉल का उपयोग करें


86

अपने आवेदन में, मैं पीएमडी के माध्यम से अपना कोड चला रहा हूं। यह संदेश मुझे दिखाता है:

  • प्रिंटस्टैकट्रेस () से बचें; इसके बजाय एक लकड़हारा कॉल का उपयोग करें।

इसका क्या मतलब है?


जवाबों:


137

इसका मतलब है कि आपको लॉगिंग ढांचे का उपयोग करना चाहिए या और सीधे मुद्रण अपवादों के बजाय:

e.printStackTrace();

आपको इस फ्रेमवर्क एपीआई का उपयोग करके उन्हें लॉग इन करना चाहिए:

log.error("Ops!", e);

लॉगिंग फ्रेमवर्क आपको बहुत अधिक लचीलापन देते हैं, जैसे आप चुन सकते हैं कि आप कंसोल या फ़ाइल में लॉग इन करना चाहते हैं - या शायद कुछ संदेश छोड़ दें यदि आप उन्हें कुछ वातावरण में प्रासंगिक नहीं पाते हैं।


39

यदि आप printStackTrace()एक अपवाद पर कॉल करते हैं, तो ट्रेस को लिखा जाता है System.errऔर इसे कहीं और रूट करना मुश्किल है (या इसे फ़िल्टर करें)। ऐसा करने के बजाय आपको लॉगिंग फ्रेमवर्क (या अपाचे कॉमन्स लॉगिंग जैसे कई लॉगिंग फ्रेमवर्क के आसपास एक आवरण) का उपयोग करने की सलाह दी जाती है और उस फ्रेमवर्क (जैसे logger.error("some exception message", e)) का उपयोग करके अपवाद लॉग करें ।

ऐसा करना जो आपको अनुमति देता है:

  • एक साथ विभिन्न स्थानों पर लॉग स्टेटमेंट लिखें, जैसे कंसोल और एक फाइल
  • गंभीरता (त्रुटि, चेतावनी, जानकारी, डिबग आदि) और मूल (सामान्य रूप से पैकेज या वर्ग आधारित) द्वारा लॉग स्टेटमेंट को फ़िल्टर करें
  • कोड को बदलने के बिना लॉग प्रारूप पर कुछ प्रभाव पड़ता है
  • आदि।

17

त्रुटियों और अन्य निदानों की रिपोर्ट करने के लिए एक उत्पादन गुणवत्ता कार्यक्रम को कई लॉगिंग विकल्पों (जैसे log4j, logback, java.util.log) में से एक का उपयोग करना चाहिए। इसके कई फायदे हैं:

  • लॉग संदेश कॉन्फ़िगर करने योग्य स्थान पर जाते हैं।
  • अंतिम उपयोगकर्ता संदेशों को तब तक नहीं देखता है जब तक कि आप लॉगिंग को कॉन्फ़िगर नहीं करते हैं ताकि वह / वह करता है।
  • आप कितने लॉगर या लॉगिंग स्तर का उपयोग कर सकते हैं, यह नियंत्रित करने के लिए कि लॉगिंग कितनी कम या अधिक दर्ज की गई है।
  • लॉगिंग जैसा दिखता है, उसे नियंत्रित करने के लिए आप अलग-अलग ऐपेंडर स्वरूपों का उपयोग कर सकते हैं।
  • आप लॉगिंग आउटपुट को बड़ी मॉनिटरिंग / लॉगिंग फ्रेमवर्क में आसानी से प्लग कर सकते हैं।
  • उपरोक्त सभी अपने कोड को बदले बिना किया जा सकता है; यानी तैनात एप्लिकेशन की लॉगिंग कॉन्फिग फाइल को एडिट करके।

इसके विपरीत, यदि आप सिर्फ प्रिंटस्टैकट्रेस का उपयोग करते हैं, तो तैनातीकर्ता / अंत उपयोगकर्ता के पास कोई नियंत्रण नहीं है, और लॉगिंग संदेश अनुचित परिस्थितियों में या तो खो जाने या अंतिम उपयोगकर्ता को दिखाए जाने के लिए उत्तरदायी हैं। (और कुछ भी नहीं एक यादृच्छिक स्टैक ट्रेस से अधिक डरपोक उपयोगकर्ता को भयभीत करता है।)


5

सरल में, e.printStackTrace () अच्छा अभ्यास नहीं है, क्योंकि यह स्टैक ट्रेस को मानक त्रुटि पर प्रिंट करता है। इस वजह से आप वास्तव में नियंत्रित नहीं कर सकते हैं कि यह आउटपुट कहां जाता है।


0

लगभग हर लॉगिंग फ्रेमवर्क एक ऐसी विधि प्रदान करता है जिसमें हम एक संदेश के साथ फेंकने योग्य वस्तु को पास कर सकते हैं। पसंद:

public trace(Marker marker, String msg, Throwable t);

वे फेंकने योग्य वस्तु के स्टैकट्रेस को प्रिंट करते हैं।


इस सवाल का जवाब नहीं है।
स्टीफन सी

-1

कंपनी कॉन्सेप्ट से बात करते हैं। लॉग आपको लचीला स्तर देता है ( logger.info और logger.debug के बीच अंतर देखें )। अलग-अलग लोग अलग-अलग स्तर देखना चाहते हैं, जैसे क्यूएएस, डेवलपर्स, बिजनेस लोग। लेकिन e.printStackTrace () सब कुछ प्रिंट कर लेगा। इसके अलावा, जैसे कि इस विधि को आराम से बुलाया जाएगा, यह एक ही त्रुटि कई बार मुद्रित हो सकती है। तब आपकी कंपनी में Devops या Tech-Ops लोग पागल हो सकते हैं क्योंकि उन्हें एक ही त्रुटि अनुस्मारक प्राप्त होगा। मुझे लगता है कि एक बेहतर प्रतिस्थापन log.error("errors happend in XXX", e) यह हो सकता है यह पूरी जानकारी भी प्रिंट कर लेगा जो e.printStackTrace () की तुलना में आसान है


-3

मुख्य कारण यह है कि प्रोगार्ड लॉग कॉल को उत्पादन से हटा देगा। क्योंकि StackTrace को लॉग इन या प्रिंट करके, उन्हें एंड्रॉइड फोन के अंदर (स्टैक ट्रेस या लॉग के अंदर की जानकारी) देखना संभव है, उदाहरण के लिए Logcat Reader एप्लिकेशन। ताकि यह सुरक्षा के लिए बुरा व्यवहार हो। इसके अलावा, हम उन्हें उत्पादन के दौरान एक्सेस नहीं करते हैं, उत्पादन से हटा दिया जाना बेहतर होगा। चूंकि ProGuard सभी लॉग कॉल को हटाता है, स्टैकट्रेस नहीं, इसलिए लॉग इन कैच ब्लॉक्स का उपयोग करना बेहतर है और उन्हें प्रोडगार्ड से प्रोडक्शन से हटा दिया जाए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.