我要做的是使用正则表达式在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
选项,使用了引号,但是当我手动运行它时没有任何匹配...我错过了什么?
答案 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)
你们一直在使解决方案复杂化
即找到规则的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>
如果你想要并在控制台中进行编辑之后导入更容易,请不要删除最后一个表达式,因为它可能会删除过滤器。 请记住增加管理包的版本号
您现在可以根据需要过滤掉这些项目,但仍然拥有其他所有项目。
警告没有多个日志文件读取器读取相同的日志文件。它不能很好地运作。