2013-10-27 87 views
2

我想讓我的應用程序在Windows事件查看器中爲全局「應用程序」日誌顯示警告和錯誤。我已經成功地遵循指導here,它幫助我啓動並運行ETW,但是當我通過跟蹤程序明確啓用日誌記錄時,我只能看到事件,即使這樣,它們也只會顯示在生成的.etl文件中,而不是全局登錄。將ETW事件發送到全局「應用程序」日誌

如何以編程方式向全局應用程序日誌註冊和寫入事件,以便當用戶運行事件查看器時,他們將從我的應用程序中看到事件?它甚至有可能嗎?概括地說,我要的東西,如下面的截圖結束,只需要較少使用Photoshop:

enter image description here

+0

......彷彿任何人實際上設法發現在全球應用相關的事件日誌...如果你的事件實際上是將要尋找,使用一個單獨的日誌,「應用程序」一個是污染最嚴重的,找到你在找的東西總是一場噩夢。 –

+0

@MatteoItalia個人而言,當我的機器發生任何錯誤時,我所做的第一件事是檢查事件查看器。很大一部分時間,這些信息讓我自己解決問題,或者至少知道下一步要搜索什麼。我想爲使用我的應用的用戶提供相同的體驗。自定義事件日誌的問題是,沒有人知道它在那裏。 – MooseBoys

回答

2

ETW似乎是你的目的相當複雜,這裏的寫入事件日誌的程序:

a)一次性安裝(您通常會在安裝應用程序時執行此操作)Register your application as a Event Provider;只有真正需要的EventMessageFile條目:
- 鍵= HKEY_LOCAL_MACHINE \系統\ CurrentControlSet \服務\事件日誌\應用程序\ MyCoolGame
- 字符串名稱(REG_EXPAND_SZ)= EventMessageFile
- 字符串值= C:\ WINDOWS \ Microsoft.NET \框架\ v4.0.30319 \ EventLogMessages.dll

b)根據程序的啓動:Register Event Source和接收處理:

hEventLog = RegisterEventSource(NULL, lpszAppNameName); 

C)使用ReportEvent function將條目寫入到事件日誌:

TCHAR szLogBuffer[] = _T("Started new multiplayer server."); 
const TCHAR *lpszEventStrings[2] = {szLogBuffer, NULL}; 
ReportEvent(hEventLog, EVENTLOG_INFORMATION_TYPE, 0, 1, NULL, 1, 0, lpszEventStrings, NULL) 

d)在程序關機:

DeregisterEventSource(hEventLog); 
相關問題