和/或XPath查询以选择一些事件日志记录

时间:2018-07-29 23:57:05

标签: c# xpath event-log readeventlog

我在Google上搜索了很多可能的答案,但是没有运气。我正在尝试从事件日志(伪代码)中提取以下内容:

select events
where
    event date/time between FromDateTime and ToDateTime
and
   ((Level<=2)  //  error, critical only
    or 
    ((Level<=x) and Provider[Name] in a specific list)  // any messages for these apps
   )

(第二个“级别”表达式是允许用户指定是否包含参考消息或警告和更高级别的限制,所以我不能只是丢弃它。)

以下是我尝试使用的(最新)表达式-失败。

    string queryString = 
"*[System[TimeCreated[@SystemTime>='" + dFrom + "' and @SystemTime<='" + dTo + "']]] " +
" and " +
"(*[System[Level<=2]]" +
" or " +
" ( " + 
" *[System[Provider[@Name='<1st name>' or @Name='<2nd name>' or @Name='<3rd name>]] " + 
" and " +
"System[Level<=" + maxLevel.ToString() + "]]" +
")" +
");"

我是要创建一个对事件日志查询评估器来说太难的表达式,还是在表达式中出现一个简单的错误? 我一直在尝试各种形式的表达。看来“级别”过滤器只是被忽略了,为什么?

2 个答案:

答案 0 :(得分:1)

***啊! -我想我找到了。事件日志级别枚举为:

1 - Critical alert
2 - Error
3 - Warning
4 - Informational
5 - Logs at all levels
  ... and ...
0 - Undefined - indicates logs at all levels

事实证明,Microsoft组件中的某些“信息”日志条目使用级别0而不是4,因此这些信息正在由过滤器获取。 我认为日志条目(尤其是Microsoft的日志条目)将使用适当的级别是错误的。

我将需要明确查找(级别= 1或级别= 2)-级别<= 2将获取各种Microsoft“信息”日志条目。

对于任何感兴趣的人-最终可行的查询是:

*[System[TimeCreated[@SystemTime>='2018-07-30T17:22:30.000Z' 
    and @SystemTime<='2018-07-30T20:22:30.000Z']  
and (Level=1 or Level=2 or
  (Provider[@Name='Application Error' or @Name='Application Hang']
  and (Level=1 or Level=2 or Level=3 or Level=4)))]]

答案 1 :(得分:0)

在您发布的代码中我可以看到两个问题。

  • 第三个名称上的单引号未关闭:variable "a_records" { default = [ ["@" , "5.6.7.8"], ["@" , "7.6.7.8"], ["@" , "9.9.9.9"], ["self", "7.10.11.12"], ["self", "11.11.111.11"], ["self", "12.12.12.12"], ["self", "13.13.13.13"], ["www" , "14.14.14.14"], ["www" , "14.14.14.14"] ] } output "a_records_in_dns_module" { value = "${var.a_records}" } 应该为@Name='<3rd name>]]
  • @Name='<3rd name>']]的第二个过滤器应为*/System/Level

从您的伪代码和共享的内容看,您似乎可以将某些逻辑合并并移动到*[System[Level<=" + maxLevel.ToString() + "]]] "的谓词过滤器中,并使用XPath,例如:

*/System