【发布时间】: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>'{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 错误吗?
【问题讨论】: