2011-06-02 212 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,这不会给你一个系统重新启动次数。

相关问题