2012-01-09 45 views
23

我目前使用TopShelf與控制檯應用程序來創建Windows服務。當我作爲控制檯應用程序運行代碼時,我使用一些Console.WriteLine()來輸出結果。一旦代碼完成它應該做的事情,我將控制檯應用程序安裝爲Windows服務。Windows服務中的Console.WriteLine()?

即使Windows服務無法寫入控制檯,離開Console.WriteLine()代碼是否有任何缺點?如果我離開了Console.WriteLine(),那麼是否存在代碼不穩定的風險?

+4

儘管(就像@dtech和@ odie指出的那樣),這並不會造成任何破壞,我建議你看一下日誌框架,比如log4net或NLog – yas4891 2012-01-09 18:08:02

回答

30

The output will simply be discarded

在Windows服務中沒有控制檯,因此Console.Write *輸出是 丟棄。有許多替代品:

  1. 的System.Diagnostics.Trace類有一個類似的界面到 Console類,所以你可以很容易地移植代碼到這一點。
  2. 然後可以將其配置爲輸出到文件。您可以使用 System.Diagnostics.EventLog類寫入事件日誌,然後使用事件查看器進行監視。
  3. 您可以使用非常靈活的第三方 開放源代碼log4net庫。
7

不,控制檯類將安全地寫入標準輸出,但是您只是看不到輸出。

+1

stdout已知可以填滿,我認爲那就是關注點來自 – Patrick 2016-03-02 01:42:45

2

如果使用System.Diagnostics.Trace功能,則可以使用偵聽器和開關重定向輸出。如果使用TRACE符號進行編譯,則會包含代碼。如果您不添加TRACE,則不會將其編譯到項目中。

如果您將服務作爲控制檯運行以進行調試,則默認情況下,跟蹤將輸出到控制檯。由於我可以從配置文件中將跟蹤信息輸出到文件,屏幕,數據庫等的任意組合,因此我採用Trace來代替調試或控制檯寫入。

+0

跟蹤輸出到調試器控制檯,而不是像Console.WriteLine那樣的控制檯窗口。在我看來,這裏有一些關於OP正在討論的控制檯的混淆。 – ProfK 2014-11-13 18:09:44

+0

跟蹤可以配置爲具有多種形式的輸出,包括通過ConsoleTraceListener輸出到控制檯。跟蹤和調試的默認監聽器是DefaultTraceListener,它輸出到調試控制檯。 – 2014-11-28 22:59:00

2

輸出始終被丟棄,直到Windows Server 2008R2。在安裝在該操作系統上的服務中留下console.writeline(),根據writeline()的位置,在啓動/運行服務時將得到錯誤1067。

+1

你能否認定你的意思是「取決於職位......」?我剛剛遇到了這個問題,通過刪除Console語句來解決它,但是我爲什麼之前從未見過這個問題感到困惑,因爲多年來我已經制作了大量的Windows服務。我已經在Windows 2008 R2 Svr以及Windows 7 Enterprise上確認了這個問題。 – 2015-02-06 07:03:30