2008-11-24 10 views
14

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

protected override void OnStart(string[] args) 
{ 
    EventLog.WriteEntry("Starting service", EventLogEntryType.Information); 

    try 
    { 
     //... 
     base.OnStart(args); 
    } 
    catch (Exception ex) 
    { 
     EventLog.WriteEntry("Service can not start. Stack trace:" + ex.StackTrace, EventLogEntryType.Error); 
     Stop(); 
     return; 
    } 

    EventLog.WriteEntry("Service started", EventLogEntryType.Information);   
} 

लेकिन अफसोस, कोई जानकारी नहीं कभी लॉग में लिखा गया था। आखिर में मैंने इसे पहली लॉग प्रविष्टि में लिखा था। इसने अपवाद फेंक दिया क्योंकि एप्लिकेशन इवेंट लॉग हालिया प्रविष्टियों से भरा था, और केवल 7 दिनों से अधिक प्रविष्टियों को ओवरराइट करने के लिए कॉन्फ़िगर किया गया था।

इवेंट लॉग में लिखने के सर्वोत्तम अभ्यास क्या हैं, इस पर विचार करते हुए कि मैं एप्लिकेशन इवेंट लॉग की कॉन्फ़िगरेशन नहीं बदल सकता?

क्या मुझे हमेशा प्रयास करने के लिए EventLog.WriteEntry डालना चाहिए, यदि हां, तो मुझे अपवाद को कैसे संभालना चाहिए (इसे ईवेंट लॉग में लिखना शायद एक बुरा विचार है), क्या मुझे अपने OnStart विधि में ईवेंट लॉग स्थिति की जांच करनी चाहिए, या आपके पास कोई बेहतर सुझाव है?

उत्तर

2

मुझे लगता है कि लॉगिंग अपवाद दुर्लभ मामलों में से एक है जहां आप अपवाद को निगलने से बेहतर हैं। ज्यादातर मामलों में आप नहीं चाहते हैं कि आपका ऐप इस पर असफल हो।

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

+15

इवेंट लॉग में लिखना "आपके लॉगिंग कोड को स्वयं लिखना" नहीं है। – MusiGenesis

+0

@MusiGenesis: कृपया समझाएं। लॉगिंग विशिष्ट अपवाद हैंडलिंग लिखने के लिए मुझे कोड लिखना है जो उदाहरण के लिए Log4Net या NLog द्वारा पहले से ही बेहतर किया जा चुका है। मुझे एक और लॉगिंग फ्रेमवर्क लिखने का कोई कारण नहीं दिखता है। – Mendelt

+7

सिस्टम। डायग्नोस्टिक्स.इवेंटलॉग विंडोज इवेंट लॉग में लिखने के लिए एक अंतर्निहित .NET क्लास है, कुछ ऐसा नहीं जो उन्होंने स्वयं लिखा है। – MusiGenesis

11

log4net उपयोग

log4net उपयोग करने का लाभ यह है कि आप प्रवेश की जाँच करें और कहीं अधिक लचीलेपन के साथ इसे नियंत्रित से आप अपने कोड के भीतर के लिए खाते में जाएगा कर सकते हैं।

यदि आप ईवेंट लॉग में लॉग इन कर रहे थे, और समस्याएं देख रहे थे और कोई ईवेंट लॉग प्रविष्टियां नहीं थीं, तो आप हमेशा फ़ाइल-एपेंडर लॉग पर स्विच कर सकते थे और इसे देखकर देखा था ... जो आपको तब बताएगा कि यह था घटना लॉग के साथ कुछ करने के लिए।

लॉग 4नेट भी रक्षात्मक है, अगर यह लॉग प्रविष्टि लिखने में विफल रहता है तो यह आपके प्रोग्राम को क्रैश नहीं करेगा। तो आपने ऐसा नहीं देखा होगा (इसलिए आपके पास लॉग इन फ़ाइलें नहीं होंगी, लेकिन आपका प्रोग्राम चल रहा होगा और फिर आप लॉग फाइल प्राप्त करने के लिए दूसरी लॉगिंग विधि निर्दिष्ट कर सकते थे)।

log4net दस्तावेज में कुंजी बिट यह है:

[log4net] सर्वोत्तम-प्रयास और असफल रोकने प्रवेश प्रणाली है।

असफल होने के कारण, हमारा मतलब है कि लॉग 4नेट रन-टाइम पर अप्रत्याशित अपवाद नहीं फेंक देगा जिससे संभावित रूप से क्रैश हो जाएगा। यदि किसी भी कारण से, log4net एक अपरिचित अपवाद फेंकता है (ArgumentException और ArgumentNullException को छोड़कर जिसे फेंक दिया जा सकता है), कृपया [email protected] मेलिंग सूची में एक ईमेल भेजें। अपरिचित अपवादों को तत्काल ध्यान देने की गंभीर बग के रूप में संभाला जाता है।

इसके अलावा, log4net System.Console.Out या System.Console पर वापस नहीं आ जाएगा। त्रुटि जब इसकी नामित आउटपुट स्ट्रीम खोला नहीं जाता है, तो लिखने योग्य नहीं होता है या पूर्ण हो जाता है। यह उपयोगकर्ता के टर्मिनल को बाढ़ से अन्यथा कामकाजी कार्यक्रम को दूषित करने से बचाता है क्योंकि लॉगिंग विफल हो जाती है। हालांकि, log4net System.Console.Error और System.Diagnostics पर एक संदेश आउटपुट करेगा। यह इंगित करता है कि लॉगिंग निष्पादित नहीं की जा सकती है।

(मेरा जोर)

सबसे चीजों के लिए, वहाँ एक पुस्तकालय की तुलना में आप करेंगे बेहतर यह होता है कि है। सबसे अच्छी बात यह है कि कभी भी आविष्कार नहीं करना है, log4net लॉग इन करने में हल करता है। नेट और आपके जीवन को आसान बना देगा।

+2

दरअसल, लॉग 4नेट में ऐप्स को क्रैश करने की क्षमता होती है (कॉम्पैक्ट फ्रेमवर्क/विंडोज़ मोबाइल ऐप्स कम से कम) - प्रकार। Log4net के यूडीपी एपेंडर का उपयोग ActiveSync को क्रैश करेगा (जो पीसी को डिवाइस जोड़ता है)। मैंने इसे एक डेमो के दौरान सीखा जहां हमने एक बड़ा संपर्क खो दिया। – MusiGenesis

+0

मुझे लगता है कि यह विंडोज सेवा में, लॉग 4नेट और विंडोज इवेंट लॉग का उपयोग करने के लिए पूरी तरह से उचित है। विंडोज इवेंट लॉग बहुत उच्च स्तर की घटनाओं के लिए लॉग करता है, कि एक sysadmin एक त्वरित रूप से देख सकते हैं; और एक बहुत अधिक विस्तृत log4net लॉग जो आपके कोड की गतिविधि पर अत्यधिक जानकारी प्रदान करता है। –

2

Logging App Block का उपयोग करने में देखें।

एंटरप्राइज़ लाइब्रेरी लॉगिंग एप्लिकेशन ब्लॉक सामान्य लॉगिंग कार्यों के कार्यान्वयन को सरल बनाता है। डेवलपर्स स्थानों की एक किस्म के जानकारी लिखने के लिए लॉग इन ब्लॉक का उपयोग कर सकते हैं:

  • घटना लॉग इन करें
  • एक ई-मेल संदेश
  • एक डेटाबेस
  • एक संदेश कतार
  • एक पाठ फ़ाइल
  • एक डब्ल्यूएमआई घटना
  • एप्लिकेशन ब्लॉक एक्सटेंशन बिंदुओं का उपयोग कर कस्टम स्थान
4
System.Diagnostics.EventLog log = 
    new System.Diagnostics.EventLog("YourLogNameHere"); 
log.ModifyOverflowPolicy(
    System.Diagnostics.OverflowAction.OverwriteAsNeeded, 0); 

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

+0

दुर्भाग्य से मुझे इवेंट लॉग की कॉन्फ़िगरेशन बदलने की अनुमति नहीं है। – Treb

+0

क्या आप एक एप्लिकेशन-विशिष्ट लॉग बना सकते हैं और सामान्य "एप्लिकेशन" लॉग के बजाय उस पर लिख सकते हैं? – MusiGenesis

+1

हालांकि यह विंडोज सेवा के लिए ठीक काम कर सकता है, जो आमतौर पर ऊंचे विशेषाधिकारों के साथ चल रहा है, सामान्य उपयोगकर्ताओं (यानी गैर-प्रशासक) द्वारा संचालित डेस्कटॉप एप्लिकेशन, 'ModifyOverflowPolicy' पर कॉल पर असफल हो सकते हैं क्योंकि इसे नियमित उपयोगकर्ताओं की रजिस्ट्री अनुमतियों की आवश्यकता होती है डिफ़ॉल्ट रूप से नहीं है। –

3

क्या आप केवल डिफ़ॉल्ट ईवेंट-लॉग तंत्र का उपयोग नहीं कर सकते हैं जो सर्विसबेस क्लास पहले से ही प्रदान करता है? यदि आपकी सेवा शुरू नहीं होती है तो यह स्वचालित रूप से ईवेंट लॉग में प्रविष्टि लिखने के लिए (stacktrace के साथ) लिख जाएगी।

इसके अलावा, और log4net (या लॉगिंग सिस्टम जैसे किसी अन्य सर्वोत्तम प्रयास) के बारे में टिप्पणियों के बारे में, मुझे लगता है कि यह वास्तव में निर्भर करता है कि आप क्या हासिल करने की कोशिश कर रहे हैं।

लॉग 4नेट (या सर्विसबेस के ईवेंट लॉगिंग के लिए अंतर्निहित समर्थन) का उपयोग करके आपके उदाहरण में सबसे अधिक संभावना है।

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

तो, कभी-कभी आपको यह जानने की आवश्यकता होती है कि लॉगिंग प्रयास कब विफल हुआ और इसे स्वयं ही संभाल लें। इस कोर्स (चिकन-अंडे-समस्या) की सीमाएं हैं, और आप जो भी करते हैं वह विशेष एप्लिकेशन या परिदृश्य के लिए बेहद विशिष्ट है।

0

के यहाँ वापस एक कदम लेते हैं:

प्रणाली ईवेंट लॉग सिस्टम व्यवस्थापक सिस्टम पर कुछ के साथ एक समस्या थी कि सचेत करने के लिए नहीं है। आपको सेवा को विफल होने की अनुमति देनी चाहिए।यह "सेवा नियंत्रण प्रबंधक" के एक रिपोर्ट स्रोत के साथ सिस्टम त्रुटि लॉग में दिखाई देगा। इसका मतलब है कि sys व्यवस्थापक विफलता के बारे में पता चल जाएगा।

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

फिर आप सिस्टम इवेंट लॉग में किसी भी समस्या की पहचान कर सकते हैं और अपने एप्लिकेशन लॉग में विफलता के समय को पार कर सकते हैं।

+1

विशिष्ट उदाहरण को देखते हुए, मुझे सेवा को विफल होने क्यों देना चाहिए? सेवा शुरू करने और ईवेंट को रोकने के लिए यह सामान्य प्रथा है, लेकिन ईवेंट लॉग भरना सेवा शुरू करने के लिए कोई अच्छा कारण नहीं है। चल रही सेवा अधिक महत्वपूर्ण है, इवेंट लॉगिंग सिर्फ 'अच्छा है' है। – Treb

+0

मुझे नहीं लगता कि मैं आपकी समस्या को पूरी तरह से समझता हूं। क्या आप ईवेंट लॉग में सभी अपवाद लॉग कर रहे हैं? या आवेदन दुर्घटनाग्रस्त होने से पहले शीर्ष स्तर पर बस अपवाद अपवाद? –

+1

मेरा प्रश्न अपवाद लॉगिंग के बारे में नहीं था, लेकिन लॉग पर लिखते समय अपवादों के बारे में बताया गया था। सेवा स्टार्टअप के दौरान अपवाद के विशिष्ट मामले में, मैं एक लॉग संदेश लिख रहा हूं 'सेवा शुरू नहीं हो सका', जिसमें अपवाद के बारे में विवरण भी शामिल है, लेकिन हाथ में समस्या किसी भी लॉग प्रविष्टि का लेखन है। – Treb

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

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