2009-04-13 16 views
0

我正在開發一個日誌分析服務,它捕獲Windows事件日誌中的特定安全事件。我最初的想法是使用微軟的LogParser,但除了選擇事先已知的特定實例/事件ID之外,我沒有尋找任何功能。是否有一種內置方法可用於在.NET EventLog.Entries集合中對條目進行二分搜索?

經過一些基準測試後,我發現迭代整個.NET EventLog.Entries集合的速度比查詢Microsoft的LogParser快3倍。

最終,要拖動的數據將保存在SQL Server數據庫中。由於該服務每天都會執行此項任務,因此我希望避免重複輸入,並且我需要一種方法來查找EventLog.Entries集合中尚未存在於數據庫中的下一個條目。一旦找到初始條目,我可以開始插入數據庫。

我只是寫一個二進制搜索找到使用從數據庫中最新DATETIME時間戳字段和EventLog.Entries收集它從項目相較於TimeWritten財產此項。這我可以做,但我想知道是否已經有一個內置的方法來執行此搜索?

回答

1

最後我寫我自己,因爲我無法找到一個內置的實現:

/// <summary> 
/// Performs a binary search on a specified EventLogEntryCollection's 
/// TimeWritten property 
/// </summary> 
/// <param name="entries">The collection to search</param> 
/// <param name="value">The timestamp value being searched</param> 
/// <param name="low">The lower-bound search index</param> 
/// <param name="high">The upper-bound search index</param> 
/// <returns>The index of a matching timestamp, or -1 if not found</returns> 
private int BinarySearch(EventLogEntryCollection entries, DateTime value, int low, int high) 
{ 
    if (high < low) 
     return -1; 
    int mid = low + ((high - low)/2); 
    if (entries[mid].TimeWritten > value) 
     return BinarySearch(entries, value, low, mid - 1); 
    else if (entries[mid].TimeWritten < value) 
     return BinarySearch(entries, value, mid + 1, high); 
    else 
     return mid; 
} 
0

我不知道EventLogEntryCollection,但是如果你需要一個通用的二分搜索算法,你可以使用PowerCollections庫中實現的那個算法。

相關問題