事件日志API缺少条目

时间:2018-07-02 10:49:57

标签: c# event-log

我正在尝试从事件日志中检索最新事件。我找到了这个答案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的日志条目要多,这似乎只是在某个时刻停止了。

1 个答案:

答案 0 :(得分:0)

如果其他任何人有相同的问题,则似乎是由于从文件读取后并不总是处理EventLog对象。

一旦发生这种情况,您似乎将以某种方式破坏或破坏文件,除非您清除文件,否则您将无法获取最新数据。