2008-10-14 14 views
18

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

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

अद्यतन:

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

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

उत्तर

31

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

+2

कंसोल का उपयोग करना। सैटऑट एक न्यूनतम पर्याप्त परिवर्तन था जो सेवा के साथ समस्या का निर्धारण करने के लिए पर्याप्त जानकारी प्रदान करता था। अगली बार –

3

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

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

3

डीबग.वाइटलाइन का उपयोग करें और sysinternals डीबगव्यू का उपयोग करें?

+1

या log4net और गंतव्य को कॉन्फ़िगर करें। – kenny

5

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

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); 

फिर आवेदन ईवेंट लॉग में प्रविष्टियों के लिए देखो (व्यवस्थापकीय उपकरण -> ईवेंट व्यूअर) जहां स्रोत = "MyService"।

12

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

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

<configuration> 
    <system.diagnostics> 
    <trace autoflush="false" indentsize="4"> 
     <listeners> 
     <add name="configConsoleListener" 
      type="System.Diagnostics.ConsoleTraceListener" /> 
     </listeners> 
    </trace> 
    </system.diagnostics> 
</configuration> 

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

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

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

1

मुझे एमएसडीएन पर this post मिला जो कंसोल आउटपुट को एक समृद्ध टेक्स्ट बॉक्स में बांधता है, मेरे लिए बहुत जल्दी और आसानी से काम करता है।

यह लिखित रेखा को ओवरराइड करता है, और इसे अन्य तरीकों को ओवरराइड करने के लिए विस्तारित किया जा सकता है।

1

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

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

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

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

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

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

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