2008-10-13 130 views
63

假設我正在處理VB.Net中的一個小批處理控制檯應用程序。我希望能夠構建應用程序是這樣的:將跟蹤輸出重定向到控制檯

Sub WorkerMethod() 
    'Do some work 
    Trace.WriteLine("Work progress") 

    'Do more work 
    Trace.WriteLine("Another progress update") 

    '... 
End Sub 


Sub Main() 

    'Do any setup, like confirm the user wants to continue or whatever 

    WorkerMethod()  

End Sub 

請注意,我使用Trace而不是Console我的輸出。這是因爲worker方法可能從其他地方調用,或者甚至生活在不同的程序集中,我希望能夠將不同的跟蹤偵聽器附加到它。那麼我怎樣才能將控制檯連接到跟蹤?

我已經可以通過定義一個簡單的類(如下圖所示),並添加實例來跟蹤的聽衆集合做,但我不知道是否有一個比較公認的或內置的方式來實現:

Public Class ConsoleTrace 
    Inherits Diagnostics.TraceListener 

    Public Overloads Overrides Sub Write(ByVal message As String) 
     Console.Write(message) 
    End Sub 

    Public Overloads Overrides Sub WriteLine(ByVal message As String) 
     Console.WriteLine(message) 
    End Sub 
End Class 

回答

134

您可以將以下內容添加到您的exe的.config文件中。

<?xml version="1.0"?> 
<configuration> 
    <system.diagnostics> 
     <trace autoflush="true"> 
      <listeners> 
       <add name="logListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="cat.log" /> 
       <add name="consoleListener" type="System.Diagnostics.ConsoleTraceListener"/> 
      </listeners> 
     </trace> 
    </system.diagnostics> 
</configuration> 

如果您有興趣登錄到文件,我還包括TextWriter。

+2

upvote將我指向System.Diagnostics.ConsoleTraceListner。我不知怎的錯過了。我沒有其他的app.config,但我可以用代碼很容易地設置它。 – 2008-10-13 17:24:22

+1

這對那些具有config的.exe文件很有效,但我有類似的情況,但是有一個DLL。我不想修改調用exe的.config文件(它是nunit-console.exe)。我會繼續尋找,但無論如何你都會投票贊成,因爲我確實學到了一些東西。 – 2009-05-14 13:50:56

10

偉大的解決方案,但我有一個情況,我有不同的dll被相同的調用exe運行,所以我不想修改調用exe的.config文件。我希望每個DLL都能處理它自己對跟蹤輸出的更改。

足夠簡單:

Stream outResultsFile = File.Create ("output.txt"); 
var textListener = new TextWriterTraceListener (outResultsFile); 
Trace.Listeners.Add (textListener); 

這當然會,輸出跟蹤輸出到 「output.txt的」 文件。

37

喬爾,

你可以做,而不是應用程序配置方法如下:

Trace.Listeners.Add(new ConsoleTraceListener()); 

或這一點,如果你要管理的應用程序的生命週期中添加或刪除監聽器:

ConsoleTraceListener listener = new ConsoleTraceListener(); 
Trace.Listeners.Add(listener); 

Trace.WriteLine("Howdy"); 

Trace.Listeners.Remove(listener); 

Trace.Close(); 
相關問題