我有一个任务是定期轮询应用程序事件日志以检查新条目并处理它们,稍后将它们解析为.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>'{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返回包括新消息在内的所有消息。 现在,我坚持使用&#34; *&#34;查询字符串并使用代码过滤旧条目,但这似乎不是我的最佳解决方案。
我的查询中有错吗?我对EventLogSession或EventLogReader对象的处理是错误的吗?它是一个已知的MS错误吗?
答案 0 :(得分:1)
我知道这是一个老问题,但它没有答案,我最近一直在这个领域工作。
此代码可能存在的问题:
将UTC时间用于您的日期,
unittest
而不是
.ToString("o")
不要在查询字符串中包含任何无关的XML。您只需要查询位。所以它应该是:
.ToString("yyyy-MM-ddTHH:mm:ss.fffZ")
考虑使用EventBookmark而不是构建用于日期过滤的复杂查询表达式。 EventBookmarks是为此目的而设计的。有关使用EventBookmark的示例,请参阅How to create an EventBookmark when querying the event log。
获得EventBookmark后,您只需使用:
string queryString = String.Format(
"*[System[TimeCreated[@SystemTime>'{0}']]]",
timeString);
确保您的读者从上一个书签之后的条目开始。