簡體   English   中英

高性能事件日志

[英]High Performance Event Log

所以我一直在嘗試各種方法來批量獲取事件日志數據(1000多條記錄/秒)。

我需要能夠過濾舊日志的東西,現在我存儲最后記錄的事件記錄ID並檢索事件ID大於那個的所有記錄....

我已經嘗試過EventLogQuery / EventLogReader,這個工作很快,除非我想拉消息數據,為了獲得安全日志的格式化消息,我需要調用EventLogRecord.FormattedMessage(),這使我的日志速度達到約150 /秒具有易於格式化的日志,更復雜的日志更糟糕。

我已經嘗試過System.Diagnoistics.EventLog,這不允許我構建過濾器,所以每次運行它都必須加載所有事件日志,然后我可以解析任何重復項(從上次掃描)。 我有一個服務器,在過去兩天內有200萬個事件日志,由於這個內存使用情況變得很糟糕,所以這是不行的。

我已經嘗試過使用System.Management.ManagementObjectCollection的WMI,它有過濾功能,可以從安全事件日志中快速提取消息數據(接近~1000 /秒),但是它會達到大約50 / 60k並開始拖動它的腳,做到大約1-2 /秒,最終我會得到一個Quota Violation錯誤。 :(

所以要么:

有沒有辦法避免配額違規錯誤,或者我是否想使用其他方法以此速度提取事件日志?

編輯:

我寫了一篇博文,詳細介紹了我對此的了解:

http://www.roushtech.net/2013/10/30/high-performance-event-log-reading/

主要是:WINAPI是你最好的選擇,要么寫C ++ / CLR,要么使用PInvoke。

我可能會查看命令行實用程序:

C:/> Wevtutil.exe qe Application /f:XML

文檔: http//technet.microsoft.com/en-us/library/cc732848(WS.10).aspx

它將保存書簽並從書簽繼續,並用於處理更復雜的查詢。

例如,假設您希望所有事件的ID為1530,在一組1000中,來自您保存的最后一個書簽,預先用英語呈現:

Wevtutil qe Application /f:RenderedXml /bm:bookmark.pos /sbm:bookmark.pos /c:1000 /e:Log /l:en-us /q:Event[System/EventID='1530']

這個事件看起來像:

<Log>
  <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
    <System>
      <Provider Name="Microsoft-Windows-User Profiles Service" Guid="{89B1E9F0-5AFF-44A6-9B44-0A07A7CE5845}"/>
      <EventID>1530</EventID>
      <Version>0</Version>
      <Level>3</Level>
      <Task>0</Task>
      <Opcode>0</Opcode>
      <Keywords>0x8000000000000000</Keywords>
      <TimeCreated SystemTime="2011-06-16T22:55:32.305140500Z"/>
      <EventRecordID>26196</EventRecordID>
      <Correlation/>
      <Execution ThreadID="4168" ProcessID="1660"/>
      <Channel>Application</Channel>
      <Computer>hostname.WORKGROUP</Computer>
      <Security UserID="S-1-5-18"/>
    </System>
    <EventData Name="EVENT_HIVE_LEAK">
      <Data Name="Detail">0 user registry handles leaked from \Registry\User\S-1-5-82: </Data>
    </EventData>
    <RenderingInfo Culture="en-US">
      <Message>Windows detected your registry file is still in use by other applications or services. The file will be unloaded now. The applications or services that hold your registry file may not function properly afterwards. DETAIL - 0 user registry handles leaked from \Registry\User\S-1-5-82: </Message>
      <Level>Warning</Level>
      <Task/>
      <Opcode>Info</Opcode>
      <Channel>Application</Channel>
      <Provider>Microsoft-Windows-User Profile Service</Provider>
      <Keywords/>
    </RenderingInfo>
  </Event>

使用快速輕量級xml解析器,您應該能夠在並行生成下一個結果頁面時尖叫這些數據。 如果直接捕獲過程輸出,甚至不需要將其寫入磁盤。 請確保您還捕獲std :: error,因為此實用程序還會將錯誤寫入該輸出。

我發現托管代碼太慢了,我最終使用win32 API來檢索事件日志(本地和/或遠程)。 它們很容易實現,並且有很多關於如何實現它的例子。 它也會比你嘗試和使用xml的任何事情都快得多。

新API: http//msdn.microsoft.com/en-us/library/aa385780(v = vs。85).aspx

舊API: http//msdn.microsoft.com/en-us/library/aa363652(v = vs。85).aspx

我還發現pre-vista API在我需要的時候運行良好,並且實際上比后vista機器上的新API更好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM