一千萬個為什麽

搜索
當前位置: 首頁 > 實時記錄

實時記錄

我有一個應用程序,它有一個循環,一個“調度程序”的一部分,它一直運行,是應用程序的核心。非常像遊戲循環,只是我的應用程序是WPF應用程序而且它不是遊戲。自然地,應用程序會在許多點上進行日誌記錄,但是調度程序會執行一些敏感的監視,有時候只能從日誌中分辨出可能出錯的地方(並且錯誤地我並不意味著例外)或當前狀態。

由於Scheduler的內部循環以較短的間隔運行,因此您無法在其中執行基於I/O的文件記錄(或使用事件查看器)。首先,您需要實時觀看,其次日誌文件的大小會非常快。所以我在考慮如何實時向用戶顯示這些數據,我考慮過一些事情:

  • 在UI中實時顯示數據
  • 使用AllocConsole/WriteConsole在控制臺中顯示此信息
  • 使用可顯示此信息的其他控制臺應用程序,使用管道或其他IPC技術在Scheduler和控制臺應用程序之間進行通信
  • 使用Windows'性能監視器並以某種方式使用此信息提供
  • ETW

在UI中顯示會有問題。首先它沒有與我為我的應用程序考慮的UI集成,我不想為此復雜化UI。這種診斷很少發生。其次,將會有一些非平凡的數據保護,因為Scheduler擁有自己的線程。

一個單獨的控制臺窗口可能會工作,但我仍然擔心,如果它沒有太多的門檻。分配我自己的控制臺,因為這是一個Windows應用程序,可能會比不同的控制臺應用程序(3)更好,因為我不需要擔心IPC通信和非阻塞通信。但是,用戶可以關閉我分配的控制臺,在這種情況下會出現問題。通過單獨的流程,您不必擔心它。

假設有一個用於性能監視器的API,它不會與我的應用程序集成得太好或對用戶顯而易見。使用ETW也沒有解決任何問題,只是一個隨意的想法,我仍然需要以某種方式顯示這些信息。

別人怎麽想,我會錯過其他方式嗎?

最佳答案

恭敬地 - Adrian K和Dima的答案都不正確。正確的答案是使用 Windows事件追蹤(ETW)。這是我們用於Windows中所有日誌記錄的內容。它非常強大,性能非常好。例如,W7在許多OS事件上記錄ETW事件 - 始終 - 包括處理器上下文切換。曾經在W7中使用性能監視器嗎?它正在消耗內核中的ETW事件。

我建議您使用ETW all 進行日誌記錄。為什麽?幾個原因:

  1. 無處不在
  2. 您可以在正在運行的進程中啟用禁用日誌記錄。無需重新啟動進程。 (是的,其他記錄器會這樣做,但有些不記錄)。
  3. 其設計用於包含運輸代碼。
  4. 保證記錄事件是非阻塞的:它不會導致“等待”。
  5. 我們為ETW跟蹤處理提供批次工具。最值得註意的是XPERF工具(鏈接鏈接鏈接

使用ETW事件檢測性能路徑的一大好處是,您可以使用XPERF工具將事件與內核事件集成在一起。

編寫一個可以從組件中觀察ETW事件的“監視”應用程序也非常容易。我有一個用於我們的組件之一,只是將事件顯示到控制臺。

高度建議不要嘗試編寫自己的高性能日誌記錄系統。這樣做很有挑戰性,但在性能和可靠性方面。 Windows ETW系統非常強大,性能非常好。

轉載註明原文: 實時記錄