2010-04-18 140 views
3

我有一個應用程序,它有一個循環,是「調度程序」的一部分,它始終運行並且是應用程序的核心。非常像一個遊戲循環,只是我的應用程序是一個WPF應用程序,它不是一個遊戲。自然地,應用程序在許多方面都進行了日誌記錄,但是Scheduler會進行一些敏感的監視,有時從日誌中不可能知道可能發生了什麼錯誤(以及錯誤的我不是指例外)或當前狀態。實時日誌記錄

由於調度程序的內部循環以很短的時間間隔運行,因此無法在其中執行基於I/O的日誌記錄(或使用事件查看器)。首先,您需要實時觀看它,其次,日誌文件的大小會非常快。所以我在想的方式來表達這個數據的實時用戶,有些事情我認爲:在實時

  • 顯示的數據在UI
  • 使用AllocConsole/WriteConsole顯示在控制檯此信息
  • 使用這將顯示此信息不同的控制檯應用程序,調度和使用管道或其他的IPC技術
  • 使用Windows的性能監視器並以某種方式與該信息給它
  • ETW
  • 控制檯應用程序之間的通信

在UI中顯示會有問題。首先它不會與我爲我的應用程序考慮的用戶界面集成,並且我不想僅爲此將界面複雜化。這種診斷只會發生很少。其次,會有一些不平凡的數據保護,因爲調度程序有它自己的線程。

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

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

別人怎麼想的,會有其他方法我錯過了嗎?

+0

您希望用戶如何處理顯示的信息?如果您希望收集離線數據以用於以後的分析而對性能影響最小,ETW似乎是一個不錯的選擇。 – jnoss 2010-04-19 00:23:17

+0

它不適用於以後使用,當有些事情不明顯時,電力用戶可以排除故障 – 2010-04-19 01:42:35

+0

-1很難理解你的問題究竟是什麼,或者你實際上在做什麼。 – 2010-04-24 21:42:24

回答

9

恭敬地 - Adrian K和Dima的答案都不正確。正確的答案是使用Event Tracing For Windows(ETW)。這是我們用於Windows中的所有日誌記錄。它非常強大,表現非常好。例如W7在很多操作系統事件上記錄ETW事件 - 包括處理器上下文切換。在W7中使用過性能監視器嗎?它正在消耗內核中的ETW事件。

我推薦你做全部你用ETW記錄。爲什麼?有幾個原因:

  1. 其無處不在
  2. 您可以啓用禁止在運行過程中的日誌記錄。無需重新啓動過程。 (是的,其他伐木工這樣做,但有些不這樣做)。
  3. 其設計用於包含運輸代碼。
  4. 記錄一個事件保證是非阻塞的:它不會導致'等待'。
  5. 我們提供批次 ETW跟蹤處理工具。最引人注目的是XPERF工具(linklinklink

與ETW事件插裝你的表現路徑的一個很大的好處是,你的事件,可以看到與使用XPERF工具內核事件組成。

它也很容易編寫一個'watch'應用程序,用於監視組件中的ETW事件。對於我們的組件之一,我只有一個組件可以簡單地將事件顯示到控制檯。

高度建議不要嘗試編寫自己的高性能日誌記錄系統。這樣做很難做到,但在性能和可靠性方面。 Windows ETW系統超強健,性能良好。

0

回到基本 - 單獨關注。

我通常的解決方案是使用Microsoft企業庫來處理實際的日誌記錄;我會使用數據庫作爲存儲庫,然後可以從任何應用程序(您現有的應用程序或完全獨立的應用程序)中隨意查詢。

我喜歡關於MS Ent Lib的東西,你可以配置他們登錄到各種各樣的存儲庫類型。如果需要的話,你可以擴展它們;我不確定你是否想異步工作以滿足性能/執行的限制。

我更喜歡登錄到數據庫,因爲它提供了一個很好的控制級別:它很容易查詢和合理地輕鬆地對數據進行拼湊。擁有sia dthat的Ent Lib允許基於滾動文件的日誌記錄 - 這將幫助您管理文件大小 - 但使用Db會比讀取文件更快。

我想這歸結於你的意思是「實時」是否記錄到數據庫是否足夠快。 - 實時到電腦與實時到人非常不同。

您可以登錄到內存,然後異步遍歷這些日誌條目並將它們提交到日誌存儲(DB)。對於報告,您可以使用內存中的副本來顯示「當前」狀態,並在較遠的過去將更長的時間/內容引用到數據庫中。

+0

我不需要保存數據,因此我不想使用數據庫,我只需要將這些信息實時顯示給用戶 – 2010-04-19 10:02:31

+0

然後我猜想內存中的內容會很好,但很難知道不知道應用程序的上下文。你想要保存多少數據(價值5秒,價值5分鐘)?如果事情死亡等等會發生什麼 - 你將失去所有的數據。 – 2010-04-19 20:49:10

+0

我根本不保存數據。如果有東西死了就死了。這就是爲什麼我有正常的日誌記錄。這更像是一種「顯示數據」的方式/最佳方式,數據用於診斷,但如果您沒有實時看到數據,則無用,這就是爲什麼我不保留它的原因。 – 2010-04-22 20:09:07