2014-08-27 85 views
1

我有一個使用TraceEventSession捕獲ETW消息並將其轉發到一個日誌文件的IIS應用程序: -ETW記錄 - TraceEventSession覆蓋文件

TraceEventSession _etwSession = new TraceEventSession(
    "MyEtwLog", @"C:\Logs\MyEtwLog.etl") { 100 }; 
_etwSession.EnableProvider(
    TraceEventProviders.GetEventSourceGuidFromName, "MyEtwLog"), 
    TraceEventLevel.Always); 

它工作正常,但我每次重新啓動時由於某些原因該應用程序會覆蓋日誌文件而不是附加到它。任何想法我失蹤?

在此先感謝

+0

你有沒有試過** TraceEventSessionOptions.Attach **? – magicandre1981 2014-08-27 17:38:48

+0

我試過所有三個選項都沒有成功。 – 2014-08-28 07:40:40

回答

5

聲明:我貢獻在微軟

內部TraceEvent可以追加到使用EVENT_TRACE_FILE_APPEND_MODE一個ETW文件,TraceEvent今天不支持。我們可以添加它,但是我可以看到暴露API的更多問題。

TL; DR - 完整的ETW會話及其元數據是登錄到每個文件的內容,每個會話可以有不同的選項,例如時鐘分辨率,例如可能會導致微妙的時間戳錯誤,在某些時候引起你的不滿。

這是我的建議。我已經進入了睡眠階段,但是您會放入一些邏輯來決定如何輪換文件(例如,在您的IIS實例刷新時保持跟蹤)。

var _etwSession = new TraceEventSession("MyEtwLog", @"C:\Logs\MyEtwLog." + MyTimestamp + ".etl"); 
_etwSession.EnableProvider(new Guid("MyGuid"), TraceEventLevel.Always); 

Thread.Sleep(1000 * 60); 

_etwSession.SetFileName(@"C:\Logs\MyEtwLog" + timestamp + ".etl"); 

一點背景:

ETW文件是二進制的消費者數據(日誌信息),然後通過的元數據,每一個日誌信息自由獲取ETW子系統提供的。像ThreadID,邏輯處理器編號,是內核還是用戶模式,最後但最重要的是時間戳,這實際上是一個取決於處理器頻率的值。

除了上面的內容,ETW文件「rundown」,也就是它像操作系統的狀態一樣,也會在會話開始和結束時刷新到文件。儘管事實上大多數消費者認爲ETW日誌就像是簡單的日誌,但它們並不是那種類型。它們與跟蹤時間密切相關(記住ETW主要用於Windows Kernel團隊在開始時的性能分析)。最近在這方面情況有所改善,這樣文件就可以得到充分的獨立處理,並且很可能出於您的目的。

但我可以想象很多情況下追加到同一個文件是不是一個好主意。

哦,還有一個大的。 ETW文件每次從頭到尾按順序讀取。這是它會不斷增長,你不能在中間讀取它,至少不以支持的方式閱讀:-)

最後你還是不想追加,因爲想象你寫一個日誌文件foo。etl,那麼你去購買一個屁股新的處理器,並追加到這個日誌文件中,你在前一個會話中收集的所有時間戳將會被一些數字忽略。

+0

您的建議正是我實施的(在文件名中添加時間戳)。謝謝回覆。 – 2014-10-13 10:08:07

0

我不認爲你錯過了任何東西。無法將TraceEventSession附加到現有文件。將不同的文件與TraceEventSession.Merge合併在一起是可能的,但如果它們來自同一臺機器,並且在同一時間內沒有重新啓動,則只會產生正確的結果。

在ETW API中,如果您想在TraceEventSession之外執行此操作,但有一些限制,可以使用EVENT_TRACE_FILE_MODE_APPEND選項附加方法。

+0

感謝信息拉爾斯。你知道我可以使用TraceEventSession的c#選擇嗎? – 2014-08-28 07:39:46

+0

對不起,我不知道 – 2014-08-28 10:15:49