1

我正在尝试做的是使用正则表达式在 SCOM unix 日志监控中执行特定事件(例如事件代码)的抑制。

表达式为:

((?i:warning)(?!(.*1222)|(.*1001)))

即在日志中搜索“警告”,但如果在线上存在事件 1222 或 1001,则不匹配。

我在创建规则时使用了 SCOM 中的内置测试功能,并且带有示例日志的测试按预期返回,但是当我将测试行注入 unix 日志时,不会生成任何警报。

我怀疑这可能是系统不接受的语法(它正在运行 RedHat 6 )我已经使用正则表达式工具对其进行了测试,并且看起来可以按预期工作。

当我尝试在服务器上对其进行测试时,我得到:

[root@bld02 ~]# grep ((?i:warning)(?!(.*1222)|(.*1001))) /var/log/messages
-bash: !: event not found

[root@bld02 ~]# tail /var/log/messages
Nov 13 15:07:26 bld02 root: SCOM Test Warning Event ID 1001 Round 18
Nov 13 15:07:29 bld02 root: SCOM Test Warning Event ID 1000 Round 18
Nov 13 15:07:35 bld02 root: SCOM Test Warning Event ID 1002 Round 18

所以我期待2场比赛。

正则表达式应该是什么?我已经测试了许多变体,例如: .*((?i:warning)(?!(.*1222)|(.*1001))).*,使用了-Rn选项,使用了引号等,但是当我手动运行它时没有任何匹配项......我错过了什么?

4

4 回答 4

1

grep-P除非您通过标志启用 perl 可比性,否则不支持前瞻:

试试这个:

grep -P '((?i:warning)(?!(.*1222)|(.*1001)))' /var/log/messages

我还在正则表达式周围添加了引号 - 我很确定您也需要这些引号。

于 2013-11-13T23:53:08.407 回答
0

您可以拆分正负匹配(-v):

cat /var/log/messages | grep -i warning | grep -v '1222|1001' 
于 2013-11-13T10:22:02.517 回答
0

SCOM 的“测试日志文件表达式”实用程序在 Windows 计算机上运行,​​它使用的 RegEx 解析器 (.NET) 与实际日志文件解析中使用的不同。使用标准 POSIX RegEx 在 UNIX/Linux 计算机上解析日志文件。Aparantly POSIX RegEx 不支持负前瞻(?!),这就是为什么当我手动运行命令时它不返回任何结果。

于 2013-11-13T23:39:40.460 回答
0

你把解决方案复杂化了

  1. 像平常一样创建你的日志文件阅读器,即指向/bogus/file.log,并捕获你的关键词,即警告|错误|失败等
  2. 导出管理包
  3. 编辑它以启用过滤

即找到规则的WriteActions标签并在那里插入过滤器,即

</DataSources>
<ConditionDetection ID="Filter" TypeID="System!System.ExpressionFilter">
<Expression>
  <RegExExpression>
     <ValueExpression>
        <XPathQuery Type="String">//row</XPathQuery>
     </ValueExpression>
     <Operator>DoesNotMatchRegularExpression</Operator>
     <Pattern>exampleexpression</Pattern>
 </RegExExpression>
</Expression>
</ConditionDetection>
<WriteActions>

按原样导入,然后在控制台中编辑,因为它更容易,不要删除最后一个表达式,因为它可能会删除过滤器。记得增加管理包的版本号

  1. 导入管理包
  2. 使用 AND 组添加过滤器,即 //row 包含警告和 //row 与正则表达式不匹配 (1222|1001)

您现在将根据需要过滤掉项目,但仍然拥有其他所有内容。

请注意,不要让多个日志文件阅读器读取同一个日志文件。效果不好。

于 2016-02-19T03:50:03.520 回答