在SCOM 2012 SP1中匹配unix日志监控的正则表达式测试正常但在Unix服务器上不匹配

时间:2013-11-13 10:15:06

标签: regex unix scom

我要做的是使用正则表达式在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 个答案:

答案 0 :(得分:1)

除非您通过grep标志启用perl可比性,否则

-P不支持预见:

试试这个:

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

我还在正则表达式周围添加了引号 - 我很确定你也需要它们。

答案 1 :(得分:0)

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

cat /var/log/messages | grep -i warning | grep -v '1222|1001' 

答案 2 :(得分:0)

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

答案 3 :(得分:0)

你们一直在使解决方案复杂化

  1. 正常创建日志文件阅读器 即指向/bogus/file.log,并捕获您的关键词,即警告|错误|失败等
  2. 导出管理包
  3. 编辑它以启用过滤
  4. 即找到规则的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组添加过滤器 即//行包含警告,//行与正则表达式(1222 | 1001)
    3. 不匹配

      您现在可以根据需要过滤掉这些项目,但仍然拥有其他所有项目。

      警告没有多个日志文件读取器读取相同的日志文件。它不能很好地运作。