【发布时间】:2018-07-02 10:49:56
【问题描述】:
我正在尝试从事件日志中检索最新事件。我找到了这个答案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();
两个大小值返回不同的值。 Entries.Count 保持增长,但列表中的条目数停止增加。该计数也与我在 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 似乎刚刚在某个点停止。
【问题讨论】: