【问题标题】:Event log API missing entries事件日志 API 缺少条目
【发布时间】: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 似乎刚刚在某个点停止。

【问题讨论】:

    标签: c# event-log


    【解决方案1】:

    如果其他人有同样的问题,这似乎是因为在读取文件后并不总是处理 EventLog 对象。

    一旦发生这种情况,它似乎会以某种方式破坏或损坏文件,除非您清除文件,否则您无法获得更新的数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-08
      • 1970-01-01
      • 1970-01-01
      • 2016-07-04
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多