2011-06-02 213 views
0

這裏我正在計算服務器重啓計數。使用c#篩選過去24小時的數據?

我需要過去24小時的服務器重新啓動計數。

string logType = "System"; 
EventLog ev = new EventLog(logType, System.Environment.MachineName);  
int count=0; 
for (int i = ev.Entries.Count - 1; i >= 0; i--) 
{ 
EventLogEntry CurrentEntry = ev.Entries[i]; 
if (CurrentEntry.Source.ToUpper() == "USER32") 
{ 
count = count + 1; 
} 
} 
ev.Close(); 

我試圖像

DateTime dt = DateTime.Now; 
TimeSpan ts = dt.Subtract(CurrentEntry.TimeGenerated); 
int hours = (ts.Days * 24) + ts.Hours; 

什麼建議嗎?

+0

順便說一句,'TimeSpan'有'TotalHours'屬性 – Snowbear 2011-06-02 11:22:46

+0

編輯我的答案,以提供改善解決方案,提供最好的兩個。 – Jodrell 2011-06-02 11:55:04

回答

3
var ev = new EventLog("system", System.Environment.MachineName); 
var count = ev.Entries.Cast<EventLogEntry>() 
    .Where (e => e.TimeGenerated >= DateTime.Now.AddDays(-1) 
     && e.Source.Equals("USER32", StringComparison.CurrentCultureIgnoreCase)).Count(); 

編輯:

考慮jCoder的評論對enteries正在對TimeGenerated排序。使用此代碼將獲得性能:

var ev = new EventLog("system", System.Environment.MachineName); 
int count = 0; 
var y = DateTime.Now.AddDays(-1); 
for (int i = ev.Entries.Count - 1; i >= 0 ; i--) 
{ 
    if(ev.Entries[i].TimeGenerated < y) 
     break; 
    if(ev.Entries[i].Source.Equals("USER32", StringComparison.CurrentCultureIgnoreCase)) 
     count++; 
} 
+0

它是一個可讀的解決方案,雖然它可能枚舉所有事件日誌條目,因爲它沒有關於條目順序的「知識」(最新條目可能是集合中的最後一條)。 – jCoder 2011-06-02 11:38:50

+0

這對我有用 – bala3569 2011-06-02 11:41:14

+0

@jCoder這是一個很好的觀點。如果條目集合按照TimeGenerated排序。從最後開始,在不再有時間跨度時停止,可能會加快速度。 – Magnus 2011-06-02 11:46:02

1

使用CurrentEntry.TimeGenerated來檢查它何時發生。

提出一個條件在if (CurrentEntry.Source.ToUpper() == "USER32")檢查TimeGenerated是在過去24小時內

+0

Cudnt讓你......你看過我的編輯 – bala3569 2011-06-02 11:24:42

1

這個代碼將會給你的事件的數量,在臨屋的最後一天,即有USER32在系統事件日誌源。

int count; //your result 

//When yesterday became today 
DateTime yesterday = DateTime.Now.Subtract(new TimeSpan(24, 0, 0)); 

using (EventLog appLog = new EventLog("System")) 
{ 
    count = appLog.Entries.OfType<EventLogEntry>().Where(
     e => (e.Source.ToUpperInvariant == "USER32") && 
      (e.TimeGenerated > yesterday)).Count(); 
} 

編輯:甚至更好,同時從Mangus的回答

DateTime yesterday = DateTime.Now.AddDays(-1); 
int count = 0; 

using (Eventlog appLog = new EventLog("System")) 
{ 
    count = appLog.Entries.OfType<EventLogEntry>().Count(
     e.Source.Equals("USER32", StringComparison.CurrentCultureIgnoreCase) && 
     e.TimeGenerated > yesterday 
    ) 

} 

好位如果「USER32」事件沒有與系統重啓事件的直接correllation,這不會給你一個系統重新啓動次數。

相關問題