2008-10-14 99 views
18

我們有一個部署到遠程客戶系統的C#服務。應用程序將大量的「診斷」信息寫入控制檯(即Console.WriteLine())。該服務不是「應該做的」。我們如何在另一個應用程序中捕獲該服務的控制檯輸出?如何從服務C#捕獲控制檯輸出?

WinForm版本應用程序可以在客戶位置加載。不幸的是,它的功能正確。

更新:

我們能夠改改服務,但不希望讓在這個時候發生重大變化。

我們也登錄到MSMQ,但僅限於「重要」事件。該服務確實與MSMQ進行正常操作交互。或者至少應該。當WinForm版本的時候,該服務似乎並沒有從MSMQ中拉取項目。所以,編寫去控制檯的消息可能會有問題。

回答

31

你能根本改變服務代碼?如果是這樣,使用Console.SetOut寫入文件將是最明顯的第一個端口。然後更改爲使用適當的日誌庫來發佈下一個版本:)

+2

使用Console.SetOut是一個足夠小的更改,可以獲得足夠的信息來確定服務的問題。 – 2008-10-14 16:04:09

3

我根本不會在Window Service中使用Console.WriteLine。您應該將這些錯誤記錄到日誌文件中。

這樣做的另一種方式,以便多個應用程序可以使用日誌將日誌消息發佈到MSMQ隊列。

3

使用debug.writeline並使用sysinternals debugview?

+1

或log4net下次配置目標。 – kenny 2008-10-14 16:54:52

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

然後查找其中Source =「MyService」的應用程序事件日誌(管理工具 - >事件查看器)中的條目。

12

通常,您應該避免將診斷信息直接寫入控制檯,事件日誌,MSMQ或其他應用程序代碼中的其他位置。而是調用一個日誌API,並使用配置將輸出重定向到任何你想要的地方。

例如,您可以用Trace.WriteLine(*)替換所有的Console.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

我在MSDN上發現了this post,它將控制檯輸出綁定到一個富文本框,非常快速和輕鬆地爲我工作。

它重寫WriteLine,並可以擴展以覆蓋其他方法。

1

這是我如何查看在Windows 7下運行的服務的控制檯輸出。如果您完全無法修改服務的源代碼以登錄到文件,這可能會有所幫助。

  1. 運行services.msc並編輯服務的屬性。在「登錄」選項卡上,選中「允許服務與桌面交互」

  2. 使用註冊表編輯器修改服務的ImagePath:轉到HKEY_LOCAL_MACHINE \ SYSTEM \ ControlSet001 \ services \ [您的服務名稱]和編輯ImagePath。將cmd.exe /c附加到ImagePath字符串的開頭。所以如果你的原ImagePath是c:\myService\myservice.exe你的新ImagePath應該是cmd.exe /c c:\myService\myservice.exe

  3. 開始您的服務。您應該看到一個標題爲「交互式服務檢測」的彈出窗口。選擇「查看消息」。你的屏幕應該切換上下文並顯示控制檯窗口。完成後,點擊「立即返回」按鈕。

  4. 完成調試後,將ImagePath修改回其原始值。然後取消選中服務屬性中的「允許服務與桌面交互」複選框,然後重新啓動服務。

警告:我只用一項服務完成了這項工作,它對我有用。我不知道它是否適用於任何服務,或者它是否會導致意外結果,所以我強烈建議您只在非生產環境中執行此操作。