मुझे लकड़हारा विफलताओं को कैसे संभालना चाहिए?


12

हमारी कंपनी के कई अनुप्रयोगों में, हम एक कस्टम लकड़हारे का उपयोग करते हैं। यह काफी मजबूत है, हालांकि हम इसे भविष्य में NLog जैसी किसी चीज़ से बदल सकते हैं। लकड़हारा के कार्यों में से एक आवेदन में सामना किए गए किसी भी अपवाद को लॉग करना है।

एक चिंता मुझे हमेशा लगी है कि लकड़हारे के भीतर अपवाद को संभालना एक मौन विफलता के लिए अनुमति देता है। यही है, अगर लॉग किसी दिए गए अपवाद (लकड़हारे में त्रुटि के कारण) के लिए नहीं लिखा गया है, तो मुझे इसे कैसे संभालना चाहिए और (किसी तरह) लकड़हारे में अपवाद को लॉग इन करें ?

मान लें कि WriteLog फ़ंक्शन एक अपवाद फेंकता है। क्या मुझे फ़ंक्शन को कुछ बार कॉल करने की कोशिश करनी चाहिए या जब तक कि अपवाद को फेंक न दिया जाए? क्या मुझे लकड़हारे के साथ फेंके गए अपवाद को लिखने की कोशिश करनी चाहिए (जिसके परिणामस्वरूप नीचे सभी तरह के अपवाद हो सकते हैं?)? मैं भाग्यशाली रहा हूं कि इस स्थिति का सामना नहीं कर पाया जब हम पहली बार कस्टम लकड़हारे को लागू कर रहे थे। दूसरी ओर, मेरे पास इस समय यह जानने का कोई तरीका नहीं है कि क्या लकड़हारा आवेदन अपवादों (अपने स्वयं के अपवादों के कारण) को लॉग करने में विफल रहा है।

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



5
लॉग इन करें stderrकि आपका आउटपुट माध्यम विफल हो गया है या "असंभव" हुआ है।
डोभाल

1
डेवलपर्स को एक ईमेल भेजें या बस एक ईमेल पते के साथ त्रुटि प्रदर्शित करें और उपयोगकर्ता को त्रुटि को कॉपी और पेस्ट करने दें।
च्लोए

जवाबों:


17

जब आप लकड़हारे के अपवादों का सामना करते हैं, तो आपको अपने अपवादों को लॉग करने के लिए लकड़हारे का उपयोग नहीं करना चाहिए। इसका कारण यह है कि:

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

  • आप एक अस्थायी लूप में फंस सकते हैं, प्रति सेकंड हजारों अपवाद पैदा कर सकते हैं। कल्पना कीजिए कि आप एक दूरस्थ सर्वर को अपवाद बता रहे हैं। सर्वर के साथ कोई समस्या एक अन्य अपवाद का कारण बनती है, जो एक और एक का कारण बनता है, और इसी तरह, जब तक कि कनेक्शन वापस नहीं आता है।

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

एक बार जब आप ऐसा कर लेते हैं, तो अगला सवाल यह होता है कि आप कैसे जानते हैं कि वे अपवाद हुए हैं: यदि आपके पास हजारों सर्वरों पर चलने वाले दर्जनों एप्लिकेशन हैं, तो आप नियमित रूप से उनमें से प्रत्येक पर SSH की जांच नहीं कर सकते कि वे स्थानीय रूप से कुछ लॉग कर रहे थे या नहीं ।

एक तरीका क्रोन जॉब है जो उन "असाधारण लॉग" के लिए जांच करता है और उन्हें उस स्थान पर धकेल देता है जहां अन्य अपवाद संग्रहीत होते हैं (अंततः आपके लकड़हारे का उपयोग करते हुए, लेकिन अनंत या अस्थायी छोरों से सावधान रहें!)।


मैं अपने अपवाद लकड़हारे के साथ इसी समस्या में भाग गया, जो ई-मेल पर गया। यदि यह एक सर्वर से कनेक्ट करने में विफल रहा, तो यह एक भयानक अनंत लूप में मिला। इसलिए इसके बजाय, मैंने इवेंट लॉग को डायवर्ट करने के लिए एक चेक लगाया और नए ई-मेल को बाहर भेजने से रोका जब तक कि एक नया कनेक्शन नहीं बनाया जा सका।
mgw854

मुझे लगता है कि जैसा कि आप सुझाव देते हैं हम एक कमबैक को लागू करने की कोशिश करेंगे। जॉन रेन्नोर के आवेदन को रोकने के सुझाव (एक गंभीर लॉगिंग स्थिति में) भी एक है जिसका हम पीछा कर सकते हैं जिसे हमने नहीं माना था।
ज़रीजा

क्या होगा यदि आप एक फाइल में लिखने के लिए syslog या I / O त्रुटियों को भेजते समय समाप्त हो जाते हैं? आप अभी भी समस्या को बदतर बना सकते हैं, अगर विफलता एक भीड़भाड़ नेटवर्क के कारण या डिस्क स्थान से बाहर चल रही हो। यह बिल्कुल एक समग्र समाधान नहीं है; आपको इस संभावना पर विचार करने की आवश्यकता है कि त्रुटियों को लॉग करने का कोई सुरक्षित तरीका नहीं हो सकता है। ऐसा नहीं है कि खतरनाक अपनी खुद की लकड़हारा करने के लिए जब तक आप चक्र का पता लगाने, घातीय वापस बंद, आदि को शामिल के रूप में लॉग इन करने की नहीं है
Aaronaught

11

यदि लॉगिंग आपके एप्लिकेशन के लिए महत्वपूर्ण है, तो लॉग इन विफल होने पर किसी को एप्लिकेशन को रोकना चाहिए।

यदि महत्वपूर्ण नहीं है, तो कुछ हद तक रक्षात्मक होने से लॉगिंग विफलताओं को संभालने के लिए एक द्वितीयक घटक हो सकता है जो एक माध्यमिक स्रोत में लॉग / अलर्ट करता है। लेकिन यहां तक ​​कि यह मूर्खतापूर्ण सबूत नहीं है और आपको यह विचार करना होगा कि यदि प्राथमिक लकड़हारा निगरानी कर रहा है तो माध्यमिक लकड़हारा विफल हो जाता है।

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

आदर्श रूप में आपकी बेहतर चुपचाप असफलता के रूप में कि आवेदन कम जटिल बना देगा।

अधिक महत्वपूर्ण बात, लॉगिंग विफलताओं को संभालने के लिए किसी तीसरे पक्ष से लॉग की निगरानी करना चाहिए। समय के साथ आपको यह पता लगाने में सक्षम होना चाहिए कि एक स्वास्थ्यप्रद अनुप्रयोग कितनी घटनाओं में प्रवेश कर रहा है। यदि यह कम या कोई ईवेंट लॉग करना शुरू करता है, तो निगरानी के माध्यम से आप उस 3 पार्टी तंत्र के माध्यम से होने वाली समस्या और संभावित रूप से सतर्क देख सकते हैं।


1
+1 महत्वपूर्ण और गैर-महत्वपूर्ण लॉगिंग के बीच अंतर बनाने के लिए, साथ ही समय की प्रति चूक लॉग की संख्या के महत्व को ध्यान में रखते हुए। मैं निराश हूं कि मैंने उन दो पहलुओं के बारे में नहीं सोचा है, जबकि मैं वर्षों से फालबैक लॉगिंग का उपयोग कर रहा हूं।
आर्सेनी मौरज़ेंको
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.