【问题标题】:EventLogQuery does not return new event log recordsEventLogQuery 不返回新的事件日志记录
【发布时间】:2014-12-30 11:44:07
【问题描述】:

我的任务是定期轮询应用程序事件日志以检查新条目并对其进行处理,然后将它们解析为 .evtx 文件。

这个任务没有问题。 我正在使用这样的代码:

using (var els = new EventLogSession())
{
     string timeString = timestamp.ToString("yyyy-MM-ddTHH:mm:ss.fffZ");
     string queryString = String.Format(
         "<QueryList>  <Query Id='0' Path='{0}'> <Select Path='{0}'> " + 
         "*[System[TimeCreated[@SystemTime&gt;'{1}']]]</Select> </Query> </QueryList>",
         logName, timeString);
     var query = new EventLogQuery(logName, PathType.LogName, queryString) { Session = els };
     var records = new List<EventRecord>();
     using (var logReader = new EventLogReader(query))
     {
         EventRecord record;
         while ((record = logReader.ReadEvent()) != null)
         {
              //log entries processed here
              ...
              //finally export log messages to a file
              els.ExportLogAndMessages(logName, PathType.LogName, queryString, fileName, true, CultureInfo.GetCultureInfo("en"));
         }
     }
}

不幸的是,我发现在重新启动我的 PC 并启动应用程序后 - EventLogReader 总是返回相同的消息集,即使我重新启动我的应用程序也是如此。这意味着 - logReader.ReadEvent() 方法产生的结果中不会出现新消息。

但是 - 将查询字符串更改为简单的星号并将其传递给 EventLogQuery - 解决了这种情况,logReader 返回所有消息,包括新消息。 目前,我坚持使用“*”查询字符串并使用代码过滤旧条目,但这对我来说似乎不是最好的解决方案。

我的查询有误吗?我对 EventLogSession 或 EventLogReader 对象的处理是否有错误?这是一个已知的 MS 错误吗?

【问题讨论】:

    标签: c# .net event-log


    【解决方案1】:

    我知道这是一个老问题,但没有答案,我最近一直在这个领域工作。

    此代码可能存在的问题:

    使用 UTC 时间作为您的日期,并且

    .ToString("o") 
    

    而不是

    .ToString("yyyy-MM-ddTHH:mm:ss.fffZ")
    

    不要在查询字符串中包含任何无关的 XML。您只需要查询位。所以应该是:

     string queryString = String.Format(
         "*[System[TimeCreated[@SystemTime&gt;'{0}']]]",
         timeString);
    

    考虑使用 EventBookmark 而不是为日期过滤构建复杂的查询表达式。 EventBookmarks 就是为此目的而设计的。请参阅 How to create an EventBookmark when querying the event log 以了解将 EventBookmark 用于非常相似的目的的示例。

    一旦您有了 EventBookmark,您只需使用:

     using (var logReader = new EventLogReader(query, EventBookmark))
    

    确保您的阅读器从上一个书签之后的条目开始。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-27
      • 2016-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多