सेवा सी # से कंसोल आउटपुट कैप्चर कैसे करें?

हमारे पास एक सी # सेवा है जो रिमोट ग्राहक प्रणाली पर तैनात है। एप्लिकेशन कंसोल (यानी Console.WriteLine ()) में "नैदानिक" जानकारी की पर्याप्त मात्रा लिखता है। यह सेवा "जो करना चाहिए वह नहीं कर रही है।" हम किसी अन्य एप्लिकेशन में सेवा से कंसोल आउटपुट कैप्चर कैसे कर सकते हैं?

एक WinForm संस्करण एप्लिकेशन को ग्राहक स्थान पर लोड किया जा सकता है। दुर्भाग्य से, यह सही ढंग से काम करता है।

अद्यतन करें:

हम सेवा को बदलने में सक्षम हैं, लेकिन इस समय बड़े बदलाव नहीं करना पसंद करेंगे।

हम एमएसएमक्यू पर भी लॉगिंग कर रहे हैं, लेकिन केवल "महत्वपूर्ण" घटनाओं के लिए। यह सेवा एमएसएमक्यू के साथ अपने सामान्य संचालन के लिए बातचीत करती है। या, कम से कम, यह चाहिए। WinForm संस्करण करता है जब सेवा एमएसएमक्यू से आइटम खींचने लगती प्रतीत नहीं होती है। इसलिए, कंसोल पर जा रहे संदेशों को लिखना समस्याग्रस्त हो सकता है।

18

7 उत्तर

क्या आप सर्विस कोड बिल्कुल को बदल सकते हैं? यदि ऐसा है, तो फ़ाइल को लिखने के लिए Console.SetOut का उपयोग करके कॉल का सबसे स्पष्ट पहला पोर्ट होगा। फिर अगली रिलीज के लिए उचित लॉगिंग लाइब्रेरी का उपयोग करने के लिए बदलें :)

31
जोड़ा
कंसोल का उपयोग करना .etOut एक न्यूनतम पर्याप्त परिवर्तन था जो सेवा के साथ समस्या का निर्धारण करने के लिए पर्याप्त जानकारी प्रदान करता था।
जोड़ा लेखक Mike Chess, स्रोत

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

उदाहरण के लिए, आप Trace.WriteLine (*) द्वारा सभी कंसोल। राइटलाइन को प्रतिस्थापित कर सकते हैं। फिर आप एप्लिकेशन कॉन्फ़िगरेशन फ़ाइल को संशोधित करके आउटपुट को कंसोल, फ़ाइल या अन्यत्र रीडायरेक्ट कर सकते हैं: उदाहरण के लिए कंसोल पर आउटपुट करने के लिए, कंसोलट्रेस लिस्टनर का उपयोग करें, जैसे कुछ:


  
    <trace autoflush="false" indentsize="4">
      
        
      
    
  
 

डीबगिंग करते समय, आपको कंसोल पर अपना आउटपुट मिलेगा - उस ग्राहक साइट पर जिसे आप इसे ट्रेस आउटपुट को किसी फ़ाइल में इवेंट लॉग या इसी तरह रीडायरेक्ट करने के लिए कॉन्फ़िगर करेंगे।

इससे भी बेहतर, किसी तृतीय पक्ष लॉगिंग फ्रेमवर्क का उपयोग करें (मैं Log4Net की अनुशंसा करता हूं) जो आपको System.Diagnostics.Trace से अधिक विकल्प देगा।

(*) Trace.Write/Trace.WriteLine Debug.Write/Debug.WriteLine के समान हैं, सिवाय इसके कि बाद वाले को केवल तभी संकलित किया जाता है जब DEBUG प्रतीक परिभाषित किया गया हो। तो अगर आप रिलीज बिल्ड में आउटपुट उपलब्ध होना चाहते हैं तो डीबग को ट्रेस को प्राथमिकता दें।

12
जोड़ा

आपके पास विकल्पों का एक गुच्छा है; एक फ़ाइल में कंसोल आउटपुट को पुनर्निर्देशित करना और उल्लिखित उचित लॉगिंग लाइब्रेरी का उपयोग करना दो अच्छे हैं। यहां एक मध्यम विकल्प है: इवेंट लॉग पर लिखें।

EventLog log;
string logsource = "MyService";

// execute once per invocation
if (!System.Diagnostics.EventLog.SourceExists(logsource))
{
    System.Diagnostics.EventLog.CreateEventSource(
        logsource, "Application");
}
log = new EventLog();
log.Source = logsource;
log.Log = "Application";

// replace console logging with this
log.WriteEntry(message, EventLogEntryType.Information);

Then look for entries in the Application event log (Administrative Tools -> Event Viewer) where Source = "MyService".

5
जोड़ा

debug.writeline का उपयोग करें और sysinternals डीबगव्यू का उपयोग करें?

3
जोड़ा
या अगली बार लॉग 4नेट और गंतव्य को कॉन्फ़िगर करें।
जोड़ा लेखक kenny, स्रोत

मैं एक विंडो सेवा से Console.WriteLine का उपयोग नहीं करता। आपको शायद इन त्रुटियों को लॉग फ़ाइल में लॉग इन करना चाहिए।

ऐसा करने का एक और तरीका यह है कि कई अनुप्रयोग लॉग का उपभोग कर सकते हैं लॉग संदेश को एमएसएमक्यू कतार में पोस्ट कर रहा है।

3
जोड़ा

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

  1. सेवाएं.एमसीसी चलाएं और सेवा के गुणों को संपादित करें। "लॉग ऑन" टैब पर, "डेस्कटॉप के साथ बातचीत करने की अनुमति दें" की जांच करें

  2. अपनी सेवा के ImagePath को संशोधित करने के लिए रजिस्ट्री संपादक का उपयोग करें: HKEY_LOCAL_MACHINE \ SYSTEM \ ControlSet001 \ Services \ [आपकी सेवा का नाम] पर जाएं और ImagePath संपादित करें। ImagePath स्ट्रिंग की शुरुआत में cmd.exe/c संलग्न करें। तो यदि आपका मूल छविपैथ c: \ myService \ myservice.exe है, तो आपका नया ImagePath cmd.exe /cc:\myService\myservice.exe होना चाहिए।

  3. अपनी सेवा शुरू करें। आपको "इंटरेक्टिव सर्विसेज डिटेक्शन" नामक एक पॉपअप विंडो मिलनी चाहिए। "संदेश देखें" का चयन करें। आपकी स्क्रीन को संदर्भों को स्विच करना चाहिए और कंसोल विंडो प्रदर्शित करना चाहिए। समाप्त होने पर, "अभी वापस आएं" बटन पर क्लिक करें।

  4. डिबगिंग समाप्त होने पर, ImagePath को अपने मूल मान पर वापस संशोधित करें। फिर सेवा गुणों में "डेस्कटॉप से ​​बातचीत करने की अनुमति दें" चेकबॉक्स को अनचेक करें और अपनी सेवा को पुनरारंभ करें।

चेतावनी: मैंने केवल एक सेवा के साथ ऐसा किया है और यह मेरे लिए काम करता है। मुझे नहीं पता कि यह किसी भी सेवा के लिए काम करेगा या यदि यह किसी अप्रत्याशित परिणाम का कारण बनता है तो मैं दृढ़ता से सुझाव देता हूं कि आप इसे गैर-उत्पादन वातावरण में ही करें।

1
जोड़ा