簡體   English   中英

如何從服務C#捕獲控制台輸出?

[英]How to capture console output from a service C#?

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

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

更新:

我們可以更改服務的更改,但此時不希望進行重大更改。

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

你能在所有的更改服務代碼? 如果是這樣,使用Console.SetOut寫入文件將是最明顯的第一個調用端口。 然后更改為使用適當的日志庫為下一個版本:)

通常,應避免將診斷信息直接寫入控制台,事件日志,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符號時編譯。 如果希望輸出在Release版本中可用,則更喜歡Trace to Debug。

你有很多選擇; 將控制台輸出重定向到文件並使用正確的日志庫是兩個好的。 這是一個中間選項:寫入事件日志。

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

然后在Application事件日志(管理工具 - >事件查看器)中查找Source =“MyService”的條目。

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

執行此操作以使多個應用程序可以使用日志的另一種方法是將日志消息發布到MSMQ隊列。

使用debug.writeline並使用sysinternals debugview?

我在MSDN上發現了這篇文章 ,它將Console輸出綁定到一個富文本框,非常快速,輕松地為我工作。

它會覆蓋WriteLine,並且可以擴展以覆蓋其他方法。

以下是我查看在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 /cc:\\myService\\myservice.exe

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

  4. 完成調試后,將ImagePath修改回原始值。 然后取消選中服務屬性中的“允許服務與桌面交互”復選框,然后重新啟動您的服務。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM