2011-08-11 61 views
4

我已經編寫了一個簡短的程序,用於使用在啓動和關閉時發佈的事件日誌消息來建立遠程PC的正常運行時間。目前的邏輯是:閱讀事件日誌從最新到最舊

foreach (eventlogentry) 
    { 
     if (entryTime > OldestTime) 
     { 
      if (entry = Startup) 
      { 
       addOnTime(entry.Time); 
      } 
      if (entry = Shutdown) 
      { 
       addOffTime(entry.Time); 
      } 
     } 
    } 

「OldestTime」定義多遠的時間向後掃描....

我想知道是否有無論如何輕鬆ammend我的程序來讀取事件最新到最老?

它正在讀取遠程事件日誌,它需要一段時間才能運行此功能,因爲它從最後開始並向前讀取。

我知道這是因爲我在第一個「if」中添加了一個「else」塊,以便突破foreach塊,如果該條目不是我們正在查找的時間範圍內,並且程序停止在它讀取的第一個事件。

+0

你如何閱讀事件日誌?您可能能夠更改讀取日誌的方式,以便按照不同的順序處理日誌,但是到達代碼中的這一點時,讀取已經發生,因此您無法更改排序。 – mfdoran

+0

是這些日誌文本文件?如果是這樣,你能不先把它們加載到列表中,然後從你想要的結尾讀取它? – ScruffyDuck

+0

你用什麼API來查詢這些遠程連日誌條目?有沒有可用於僅請求比OldestTime更新的條目的API?這樣的順序應該不重要。 – thelsdj

回答

0

您的最佳解決方案可能是將數據移動到列表中,然後顛倒該順序。像下面這樣:

EventLog eventLog = new EventLog(); 
eventLog.Log = myEventLog; 
var eventList = new List<EventLogEntry>(); 

foreach(EventLogEntry entry in eventLog.Entries) 
{ 
     eventList.Add(entry); 
} 

eventList.Reverse(); 

這應該讓數據以相反的順序,即最新的第一個,然後你纔可以像以前一樣處理,但這個時候退出循環,當你最古老時間之前打的日期。

它不是一個理想的解決方案,你仍在處理整個日誌,但它可能是值得嘗試,看看你得到性能的改進

3

既然你問這個問題,它已經有一段時間,但我遇到同樣的問題並找到解決方案。

using System.Diagnostics; 
using System.Linq; 

EventLog events = new EventLog("Application", System.Environment.MachineName); 
foreach (EventLogEntry entry in events.Entries.Cast<EventLogEntry>().Reverse()) 
{ 
    //Do your tasks 
} 

這awnser還不是一樣快,只是列舉向前,但它是一個有點比使用循環項目複製到一個列表更優雅。

@ leinad13,對於您的應用程序,您需要將System.Environment.MachineName更改爲一個字符串,其中包含要從中獲取事件的計算機的名稱,並將「Application」更改爲您要查看的日誌。我認爲你的情況是「系統」。

+1

EventLogEntryCollection支持索引。最好用一個反向整數迭代器遍歷它,例如'for(int i = collection.Count; i> 0; i--){collection [i] .whatever} – pensono