2012-05-21 11 views
6

मैं विंडोज सेवाओं के लिए बिल्कुल नया हूं। मैंने अपने सी # विंडोज सेवा के लिए एक इंस्टॉलर बनाया और सर्वर (विंडोज सर्वर 2003) पर स्थापना काम किया प्रतीत होता है। जब यह शुरू होता है, तो यह लॉग में Service started successfully लिखता है। जब यह बंद हो जाता है, तो यह Service stopped successfully लिखता है। हालांकि, कभी-कभी सेवा लॉग में कुछ भी लिखने के बिना चलती रहती है, इसलिए मैं इसे मैन्युअल रूप से बैक अप लेता हूं। जब मैं बाद में लॉग को देखता हूं, तो यह अनुमान के अनुसार Service started successfully कहता है। यह अजीब बात है कि लॉग में दो बार लॉग में यह स्पष्ट रूप से एक प्रविष्टि गायब है जहां सेवा किसी भी तरह से चलना बंद कर दिया था।मेरी सी # विंडोज सेवा एप्लिकेशन इवेंट लॉग में लिखे गए किसी भी संदेश के बिना क्यों चलती है?

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

संपादित करें: कुछ अतिरिक्त जानकारी:

  • मैं इसे
  • पुनर्प्राप्ति विकल्प के तहत स्थानीय सिस्टम खाते के रूप में पर लॉग ऑन करने के लिए स्थापित है, मैं यह पहली बार विफलता पर पुनः आरंभ करने के लिए स्थापित की है। मेरे पास दूसरी या बाद की असफलताओं के लिए कुछ भी नहीं है।

अद्यतन: एक उत्तर देने एक वैश्विक अपवाद संचालक की सिफारिश की। हालांकि मैं इसे स्थायी फिक्स के रूप में लागू नहीं करूँगा, लेकिन कम से कम मुझे यह पता लगाने में मदद मिलेगी कि समस्या कहां हो रही है। मैंने वास्तव में अपनी स्थापित सेवा के साथ इसका परीक्षण किया और यह काम करता है। मुझे पता चला कि अनचाहे अपवाद वास्तव में लॉग पर कुछ भी लिखे बिना सेवा को दुर्घटनाग्रस्त करते हैं। मैंने सोचा कि कम से कम कुछ एप्लिकेशन त्रुटि की रिपोर्ट होगी, लेकिन ऐसा नहीं है।

static void Main() 
{ 
    AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); 

    //other code here 
} 

static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) 
{ 
    Utilities.WriteIt(e.ExceptionObject as Exception); 
} 
+0

क्या आपने EventLog की जांच की है? – pms1969

उत्तर

4

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

+0

मैं इस मार्ग पर गया और ऐसा लगता है कि यह काम कर रहा है (कोड के साथ मेरा प्रश्न अपडेट किया गया है)। बीटीडब्लू, मैं अपवादों को संभालता हूं, लेकिन मेरे पास हर जगह ब्लॉक/पकड़ने की कोशिश नहीं है। वैश्विक हैंडलर को कार्यान्वित करना बहुत अच्छा काम करता है और मुझे यह पता लगाने देगा कि समस्याएं कहां हो रही हैं। धन्यवाद! – oscilatingcretin

3

पर लिखें ऐसा लगता है कि आपकी सेवा अपवाद-हैंडलिंग और/या लॉगिंग के किसी भी प्रकार के बिना अप्रत्याशित रूप से विफल रही है। विंडोज सेवाएं इवेंट लॉग में स्वचालित रूप से अपवाद नहीं लिखती हैं - अपवादों को संभालने के लिए यह आपके ऊपर निर्भर है और (यदि वे घातक हैं) उन्हें कहीं बाहर लिखें ताकि आप समस्या का निदान कर सकें।

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

0

यदि कोई सेवा कुछ अपवाद के कारण अप्रत्याशित रूप से निकलती है, तो मुझे यकीन नहीं है कि यह स्वचालित रूप से ईवेंट लॉग में समाप्त हो जाएगा।

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

आप EventLogAppender के उदाहरण के लिए here देख सकते हैं। हालांकि, मैं एक फाइल एपेंडर प्राप्त करने के साथ शुरू करने का सुझाव दूंगा, बनाने के लिए सबसे आसान लॉग में से एक, पहले काम करना और फिर इवेंट लॉग के लिए दूसरा एपेंडर जोड़ें।

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