1

我正在使用名为“check_logfiles”的nagios 检查来解析一堆solaris 机器上的syslog。它完全用 Perl 编写,并采用同样使用 Perl 语法的配置文件。我正在尝试使用正则表达式从检查的输出中排除以下行:

Nov 16 19:15:04 db07  Cluster.CCR: [ID 574345 daemon.debug] server address: 127.0.0.1

这是我尝试使用的正则表达式(不成功)

'^.*?(Cluster.CCR).*?$'

这是检查的整个配置文件,以防您可能需要一些上下文:

$options = 'report=long';
@searches = (
{
tag => 'syslog',
logfile => '/var/adm/messages',
rotation => 'SOLARIS',
options => 'noprotocol',
sticky  => 2400,
criticalpatterns => [
   'daemon.debug',
   'daemon.error',
   'Could not send report: Broken pipe',
   'Could not retrieve catalog from remote server: Error 400 on SERVER'
],
warningpatterns => [
    'daemon.warning',
    'daemon.info',
    'daemon.notice',
    'kern',
],
criticalexceptions => [
 'connect from nagioszone01.mydomain.com',
 'from 10.20.28.140',
 'Finished catalog run in',
 'Did not receive identification string from',
 '^.*?(Cluster.CCR).*?$'
],
 warningexceptions => [
 'connect from nagioszone01.mydomain.com',
 'from 10.20.28.140',
 'Finished catalog run in',
 'Did not receive identification string from',
 'Cluster.CCR'
],
 options => 'logfilenocry,sticky=900',
});

感谢您可能需要分享的任何建议

4

2 回答 2

0

我不知道你是否解决了它,但我建议使用 WOTS 来完成这项任务。我维护并扩展了原始的 WOTS,并将其完全用于此类设置。如果您想向 nagios 发送被动警报,它是一个集成了 nsca 客户端的 perl 守护程序。包括大量的例子。对于 WOTS:http ://www.e-dynamics.be/?section=programs

于 2013-02-20T10:37:31.877 回答
-2

正则表达式不提供任何排除“单词”的可能性 - 所以你需要使用一个workarround

想象一下,你想匹配一个 div 中的“所有东西”,但不是,如果里面有“花”这个词(你不喜欢花,所以你不想匹配那个。)

匹配 div 标签之间的所有内容:

/<div>([^<]+?)<\/div>/

不是杰作。

我们“不能”排除单词——但我们可以排除一个字符后跟一个短语。所以我们排除任何 char 后跟“lower”:

/<div>([^<](?!lower))+?)<\/div>/

这也不匹配带有其他单词(“Glower”“Alower”)的文本......

所以我们需要用另一个“lookbehind”来“修改”我们的“lookahead”:

/<div>((?:[^<](?!(?<=F)lower))+?)<\/div>/

在您的情况下,您可以使用^and$代替 div 标签并选择一些不应该在匹配值内的随机单词。

<div>((?:[^<](?!(?<=F)lower))+?)<\/div>

正则表达式可视化

调试演示

(但是,如果你想排除整行——为什么要使用正则表达式?)

于 2012-11-21T22:52:01.590 回答