我正在尝试从事件日志中检索最新事件。我找到了这个答案Read Event Log From Newest to Oldest,但它涉及加载我希望避免的整个日志。
因此,我首先尝试像这样转到日志结尾:
var eventLog = EventLog.GetEventLogs().OfType<EventLog>().Single(el => el.Log == "Security");
int logSize = eventLog.Entries.Count;
var lastScanTime = DateTime.Now.AddDays(-1),
for (int i = logSize - 1; i >= 0; i--)
{
var entry = eventLog.Entries[i];
if (entry.TimeWritten <= lastScanTime)
{
break;
}
entry.Dump();
}
这可以工作一段时间,但是如果我继续运行它,我会开始获得IndexOutOfRangeExceptions
似乎eventLog.Entries.Count不再与条目数匹配,您可以使用以下代码进行检查:
var eventLog = EventLog.GetEventLogs().OfType<EventLog>().Single(el => el.Log == "Security");
int size = eventLog.Entries.Count.Dump();
int size2 = eventLog.Entries.Cast<EventLogEntry>().ToList().Count.Dump();
两个大小值返回不同的值。条目:计数增加,但列表中的条目数量停止增加。该计数还与我在Windows事件日志查看器中看到的计数匹配。
这就像.net API中的某些内容中断了,没有更多可用的事件了。
任何人以前都看过此书,或者有任何修复程序可以使这种方法起作用。
编辑:我也发现了这个A mystery IndexOutOfRange Exception recurring when reading from a full EventLog,这似乎是一个类似的问题,但没有解决方案。我无法使用事件,因为在安装软件之前,我可能希望在计算机上进行活动。
编辑:如果我捕获到异常并将结果放入列表中,则会再次得到不同数量的事件:
var results = new List<EventLogEntry>();
for (int i = eventLog.Entries.Count; i >= 0; i--)
{
try
{
var entry = eventLog.Entries[i];
{
results.Add(entry);
}
}
catch (Exception ex) { }
}
它的计数比Entries.Count少,但比Entries的日志条目要多,这似乎只是在某个时刻停止了。
答案 0 :(得分:0)
如果其他任何人有相同的问题,则似乎是由于从文件读取后并不总是处理EventLog对象。
一旦发生这种情况,您似乎将以某种方式破坏或破坏文件,除非您清除文件,否则您将无法获取最新数据。