2011-10-14 28 views
12

我想跟蹤一個TextWriterTraceListener指向文件位置的Windows窗體應用程序中發生的奇怪事情。我已經設置好它,以便在程序運行期間應用程序第一次需要跟蹤某些內容時,它會創建跟蹤偵聽器並註冊它。.NET跟蹤文件不能正常工作

但是,看起來跟蹤文件根本沒有被創建,在C:\ GMS2Trace.log上沒有任何內容顯示。我已驗證該程序已達到調用跟蹤方法的部分代碼。

我的跟蹤代碼如下所示:

internal static void traceWarning(string message) 
{ 
    if (!traceEnabled) 
    { 
     traceEnabled = true; 
     Trace.Listeners.Add(new TextWriterTraceListener(@"C:\GMS2Trace.log")); 
    } 

    Trace.TraceWarning(getTimeStamp() + " " + message); 
} 

是否與跟蹤文件,或者別的什麼位置的問題?

回答

12

您可以從app.config中配置了一切,只需使用:

<system.diagnostics> 
    <trace autoflush="true" indentsize="4"> 
    <listeners> 
     <add name="myListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="log.log" /> 
     <remove name="Default" /> 
    </listeners> 
    </trace> 
</system.diagnostics> 

但請記住,所有Console.Writeline allso文件

在結束了:從我的項目之一

Trace.Writeline("msg"); 

3

您需要configure the trace level in the app.config file

<system.diagnostics> 
    <switches> 
     <!-- This switch controls data messages. In order to receive data 
     trace messages, change value="0" to value="1" --> 
     <add name="DataMessagesSwitch" value="0" /> 
     <!-- This switch controls general messages. In order to 
     receive general trace messages change the value to the 
     appropriate level. "1" gives error messages, "2" gives errors 
     and warnings, "3" gives more detailed error information, and 
     "4" gives verbose trace information --> 
     <add name="TraceLevelSwitch" value="0" /> 
    </switches> 
</system.diagnostics> 

和編譯與啓用跟蹤csc.exe /d:TRACE或通過添加#define TRACE到文件的頂部

+0

修正了示例代碼片段 - 錯誤的複製/粘貼:) – sehe

+1

我以爲我不得不用.config創建一個文件。那是我的問題。我只是將設置移動到app.config,所以我應該很好。 –

8

添加

Trace.AutoFlush = true; 

添加監聽

+0

這可能是問題,我會嘗試。 –

+4

或使用Trace。Flush();' – mihai

+0

這是我的問題。有一個控制檯和文件偵聽器,控制檯顯示正常,但文件是空白的。 – KeithS

3

你還需要確保跟蹤常量定義當您生成項目:

Screenshot of the TRACE constant setting

默認情況下,這對於發佈配置是關閉的,這意味着對Trace.TraceWarning的調用已完全優化。

3

你可以做到這一點的代碼:

string traceFileLocation = "yourFileName"; 
TraceSource traceSource; 
TextWriterTraceListener traceListener; 
traceSource = new TraceSource("your source name"); 
traceListener = new TextWriterTraceListener(traceFileLocation); 
traceListener.TraceOutputOptions = TraceOptions.LogicalOperationStack | 
            TraceOptions.DateTime | 
            TraceOptions.Timestamp | 
            TraceOptions.ProcessId | 
            TraceOptions.ThreadId; 
traceSource.Switch = new SourceSwitch("someName","some Name"); 
traceSource.Switch.Level = SourceLevels.Information; 
traceSource.Listeners.Clear(); 
traceSource.Listeners.Add(traceListener); 
Trace.AutoFlush = true; 

Trace.CorrelationManager.StartLogicalOperation("logical operation"); 
traceSource.TraceEvent(TraceEventType.Error, (int)TraceEventType.Error, "messsage"); 
Trace.CorrelationManager.StopLogicalOperation(); 
0

發生了什麼事我的是我沒有權限,我已經配置了我的日誌文件的目錄寫。
實際上,Trace是從作爲LocalService運行的COM +應用程序寫入的,並且該用戶對目標文件夾沒有權限。
異常對於偵聽器來說是透明的(對於程序而言),我只知道當Visual Studio在嘗試寫入第一個Trace行後在輸出窗口中顯示異常時。
將身份更改爲具有權限的用戶或將LocalService的權限添加到目標文件夾對我來說是個訣竅。