EventLogQuery 忽略 TimeCreated 条件
EventLogQuery ignoring TimeCreated criteria
我正在使用以下辅助函数:
public List<EventRecord> GetEvents(DateTime afterTime)
{
var formattedDateTime = $"{afterTime:yyyy-MM-dd}T{afterTime:HH:mm:ss}.000000000Z";
var query = $"*[(System/Provider/@Name='.Net Runtime') and (System/EventID=1000) and (System/TimeCreated/@SystemTime >= '{formattedDateTime}')]";
var queryResult = new EventLogQuery("Application", PathType.LogName, query);
var reader = new EventLogReader(queryResult);
var events = new List<EventRecord>();
while (true)
{
var rec = reader.ReadEvent();
if (rec == null)
{
break;
}
events.Add(rec);
}
return events;
}
除了查询似乎完全忽略了 TimeCreated 之外,这段代码几乎可以正常工作。它返回具有给定 ProviderName 和 EventId 的所有事件。我已经尝试了各种不同的方法来让它工作,但无论如何,TimeCreated 都被忽略了。
有人看到我做错了什么吗?
编辑 1
甚至将查询行替换为:
var query = $"*[System[TimeCreated[@SystemTime >= '{formattedDateTime}']]]";
无效。 Returns 所有事件,无论它们是何时创建的。
编辑 2
所以我尝试使用 'custom view' 生成器为我生成一个 XML 查询,但我发现更令人困惑的是:
所以目前我机器上显示的时间是:2:42pm。
在 24 小时制中,它应该是 14:42pm.
当我使用自定义视图和 select 创建查询时:
来自:'Events On' 03/18/2021 2:42pm ,它创建以下内容:
<QueryList>
<Query Id="0" Path="Application">
<Select Path="Application">*[System[Provider[@Name='.NET Runtime'] and (EventID=1000) and TimeCreated[@SystemTime>='2021-03-18T20:42:13.000Z']]] </Select>
</Query>
</QueryList>
天哪,绿色地球为什么把2:42pm转换成20:42?
显然你需要将你的时间转换为 UniversalTime 才能工作。
这是一个工作示例:
public List<EventRecord> GetEvents(DateTime afterTime)
{
var formattedDateTime = afterTime.ToUniversalTime().ToString("o");
var query = $"*[System[Provider[@Name='.NET Runtime'] and (EventID=1000) and TimeCreated[@SystemTime>='{formattedDateTime}']]]";
var queryResult = new EventLogQuery("Application", PathType.LogName, query);
var reader = new EventLogReader(queryResult);
var events = new List<EventRecord>();
while (true)
{
var rec = reader.ReadEvent();
if (rec == null)
{
break;
}
events.Add(rec);
}
return events;
}
我正在使用以下辅助函数:
public List<EventRecord> GetEvents(DateTime afterTime)
{
var formattedDateTime = $"{afterTime:yyyy-MM-dd}T{afterTime:HH:mm:ss}.000000000Z";
var query = $"*[(System/Provider/@Name='.Net Runtime') and (System/EventID=1000) and (System/TimeCreated/@SystemTime >= '{formattedDateTime}')]";
var queryResult = new EventLogQuery("Application", PathType.LogName, query);
var reader = new EventLogReader(queryResult);
var events = new List<EventRecord>();
while (true)
{
var rec = reader.ReadEvent();
if (rec == null)
{
break;
}
events.Add(rec);
}
return events;
}
除了查询似乎完全忽略了 TimeCreated 之外,这段代码几乎可以正常工作。它返回具有给定 ProviderName 和 EventId 的所有事件。我已经尝试了各种不同的方法来让它工作,但无论如何,TimeCreated 都被忽略了。
有人看到我做错了什么吗?
编辑 1
甚至将查询行替换为:
var query = $"*[System[TimeCreated[@SystemTime >= '{formattedDateTime}']]]";
无效。 Returns 所有事件,无论它们是何时创建的。
编辑 2
所以我尝试使用 'custom view' 生成器为我生成一个 XML 查询,但我发现更令人困惑的是:
所以目前我机器上显示的时间是:2:42pm。 在 24 小时制中,它应该是 14:42pm.
当我使用自定义视图和 select 创建查询时: 来自:'Events On' 03/18/2021 2:42pm ,它创建以下内容:
<QueryList>
<Query Id="0" Path="Application">
<Select Path="Application">*[System[Provider[@Name='.NET Runtime'] and (EventID=1000) and TimeCreated[@SystemTime>='2021-03-18T20:42:13.000Z']]] </Select>
</Query>
</QueryList>
天哪,绿色地球为什么把2:42pm转换成20:42?
显然你需要将你的时间转换为 UniversalTime 才能工作。
这是一个工作示例:
public List<EventRecord> GetEvents(DateTime afterTime)
{
var formattedDateTime = afterTime.ToUniversalTime().ToString("o");
var query = $"*[System[Provider[@Name='.NET Runtime'] and (EventID=1000) and TimeCreated[@SystemTime>='{formattedDateTime}']]]";
var queryResult = new EventLogQuery("Application", PathType.LogName, query);
var reader = new EventLogReader(queryResult);
var events = new List<EventRecord>();
while (true)
{
var rec = reader.ReadEvent();
if (rec == null)
{
break;
}
events.Add(rec);
}
return events;
}