[英]Windows EventLog: How fast are operations with it?
我有一個服務應用程序,通過TCP處理客戶端請求並將任何事件寫入Windows EventLog。 由於這個應用程序預計會在很短的時間內為每個客戶端提供大量請求(假設每秒1到50個請求),我很想知道它是多么密集(CPU明智和時間)和寫入Windows EventLog的速度有多快?
更具體地說,連接,讀取和寫入EventLog的操作有多密集?
不要那樣做。 事件日志不適用於此類活動:
事件日志不是常規日志記錄工具。 它應該用於報告錯誤,需要注意的情況,甚至是信息性報告,但不是用於在某處寫入的每一點信息。 如果您有大量日志需求,請使用您自己的日志工具並在事件日志中使用“指針”報告問題(如果有),以便在需要時查找詳細數據。
注意:如果確實需要事件日志,那么至少應用程序應該使用自己的日志目標,而不是標准目標之一(應用程序甚至更糟糕的系統)。 這樣它就不會影響其他應用程序操作,並且不會“隱藏”其他應用程序事件“淹沒”日志及其事件,使得更難以發現其他應用程序事件而不查找它們。
Windows事件跟蹤可能是此級別流量的更好存儲庫。
Windows事件跟蹤(ETW)是一種高效的內核級跟蹤工具,可讓您將內核或應用程序定義的事件記錄到日志文件中。 您可以實時或從日志文件中使用事件,並使用它們來調試應用程序或確定應用程序中發生性能問題的位置。
示例偽代碼:
const
MyApplicationProviderGUID: TGUID = '{47A0DECE-4DCF-4782-BCF4-82AECA6BAAB7}';
private
FETWRegistrationHandle: THandle;
...
EventRegister(MyApplicationProviderGUID, nil, nil, {out}FETWRegistrationHandle);
...
EventWriteString(FETWRegistrationHandle, 0, 0, 'Hello');
EventWriteString(FETWRegistrationHandle, 0, 0, ', ');
EventWriteString(FETWRegistrationHandle, 0, 0, 'world');
EventWriteString(FETWRegistrationHandle, 0, 0, '!');
...
EventUnregister(MyApplicationProviderGUID);
我用我的2個事件日志類進行了測試,一個寫入文件(每個log_event()
寫入並刷新已打開的文件),另一個基於EventLog( ReportEvent()
調用已注冊的EventSource)。 在我的情況下,文件日志比EventLog快10倍。 在多線程環境中,我會添加關鍵部分來保護寫入文件。
在我看來文件更好:它們很容易在像grep這樣的工具中解析。 速度對我來說不那么重要。
也許Microsoft消息隊列(MSMQ)是Windows EventLog的替代品。 它適用於所有當前版本的Windows,並提供高速,松散耦合的消息傳遞。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.