2009-05-27 91 views
12

我正在研究從遠程機器讀取事件日誌(應用程序)的應用程序。我正在使用.net中的EventLog類,然後在日誌條目上迭代,但這非常慢。在某些情況下,某些機器具有40000多個日誌條目,並且需要幾個小時來遍歷條目。 完成此任務的最佳方式是什麼? .net中是否有更快的或其他技術的其他類?什麼是在遠程機器上讀取事件日誌的最快方法?

+0

我不知道什麼是最好的閱讀事件日誌項目的方式,但我建議你重新考慮你的架構!你應該使用其他一些日誌技術!我會使用企業庫日誌應用程序塊。然後,您可以輕鬆登錄數據庫(也可以登錄到事件日誌中)。然後,您可以輕鬆地對數據庫運行查詢。 – 2009-06-01 12:52:12

回答

-1

也許是遠程計算機可以做計算的一點點。所以這樣你的服務器只會處理相關的信息。這將是一種使用遠程計算機進行光過濾的集羣,服務器將分析部分。

0

您是否嘗試過使用PowerShell 2.0中的遠程處理功能?它們允許您在遠程機器上執行cmdlet(如讀取事件日誌)並將結果(當然是對象)返回給調用會話。

0

您可以在那些將日誌保存到文件並將其發送到您的web應用程序的機器上放置一個程序,我認爲這將更快,因爲您可以做循環本地,但我不知道如何做到這一點,所以我不能確定你的任何代碼:(

15

男人,我覺得你的痛苦。我們有完全相同的問題,在我們的應用程序。

解決方案必須根據什麼服務器版本你正在運行一個分支,什麼服務器版本的「目標」機器正在運行

如果您在Vista或Windows Server 2008上都運行過,那麼您應該看看在System.Diagnostics.Eventing.Reader.EventLogQuerySystem.Diagnostics.Eventing.Reader.EventLogReader。這些在.net 3.5中是新的。

基本上,您可以使用XML構建查詢並將其發送到遠程計算機上運行。也許你只是在尋找特定類型的事件,或者只是從特定時間點開始新事件。搜索在遠程機器上運行,然後您只需返回匹配事件。新的類比舊的.net 2.0方式快得多,但是它們只能在Vista或Windows Server 2008上支持。

對於我們的應用程序,當目標不在Vista/Win2008上時,我們下載了原始程序。 evt文件從遠程系統,然後使用它的二進制格式解析文件。關於.evt文件的事件日誌格式(Vista之前)有幾個數據源,其中包括link text以及我在codeproject.com上回憶的一些有c#代碼的文章。

Vista和Windows Server 2008計算機使用新的.evtx格式,這是一種新格式,因此您無法在所有版本中使用相同的二進制分析方法。但是新的EventLogQuery和EventLogReader類非常快,您不需要。現在只需使用內置類即可快速完成。

2

事件日誌讀取器非常慢......太慢了。跆拳道微軟?

使用LogParser 2.2 - 在Internet上搜索C#和LogParser(或者可以使用命令行中的日誌解析器命令)。我不想重複已經由他人貢獻的工作。

我通過將日誌導出爲EVTX文件來從遠程系統中取出日誌。然後我從遠程系統複製文件。這個過程非常快 - 即使是跨越地球的網絡(我在將日誌導出到網絡資源時遇到了問題)。一旦你擁有本地的,你可以做你的搜索和處理。

有EVTX有多種原因 - 我不會深入理解爲什麼我們這樣做。

以下是保存EVTX日誌副本的代碼示例: (注意:「device」是網絡主機名或IP,「LogName」是所需日誌的名稱: 「System」,「Security」或「Application」。outputPathOnRemoteSystem是遠程計算機上的路徑,例如「c:\ temp \%hostname%。%LogName%。%YYYYMMDD_HH.MM%.evtx」。)

static public bool DumpLog(string device, string LogName, string outputPathOnRemoteSystem, out string errMessage) 
    { 
     bool wasExported = false; 
     string errorMessage = ""; 
     try 
     { 
      System.Diagnostics.Eventing.Reader.EventLogSession els = new System.Diagnostics.Eventing.Reader.EventLogSession(device); 
      els.ExportLogAndMessages(LogName, PathType.LogName, "*", outputPathOnRemoteSystem); 
      wasExported = true; 

     } 
     catch (UnauthorizedAccessException e) 
     { 
      errorMessage = "Unauthorized - Access Denied: " + e.Message; 
     } 
     catch (EventLogNotFoundException e) 
     { 
      errorMessage = "Event Log Not Found: " + e.Message; 
     } 
     catch (EventLogException e) 
     { 
      errorMessage = "Export Failed: " + e.Message + ", Log: " + LogName + ", Device: " + device; 
     } 
     errMessage = errorMessage; 
     return wasExported; 
    } 
2

一個很好的解釋/範例可以在MSDN找到。

EventLogSession session = new EventLogSession(Environment.MachineName); 

// [System/Level=2] filters out the errors 
// Where "Log" is the log you want to get data from. 
EventLogQuery query = new EventLogQuery("Log", PathType.LogName, "*[System/Level=2]"); 

EventLogReader reader = new EventLogReader(query); 

for (EventRecord eventInstance = reader.ReadEvent(); 
    null != eventInstance; 
    eventInstance = reader.ReadEvent()) 
{ 
    // Output or save your event data here. 
} 

當用老的代碼等待5-20分鐘時,這個在不到10秒內完成。

相關問題