Rsyslog omprog 将消息传递给脚本

Rsyslog omprog pass message to scripts

准确地说,我想过滤日志并发送一些警告邮件。

首先,我尝试了ommail,但不幸的是,这个模块只支持不需要身份验证的邮件服务器,但我的邮件服务器需要。

所以我尝试使用 omprog,我写了一个 python 脚本来登录到我的邮件服务器,它会收到一个参数,即日志并发送它作为邮件正文。 然后我遇到了问题,我无法将日志传递到我的脚本,如果我这样尝试,$msg 将被识别为字符串。

if $fromhost-ip == "x.x.x.x" then {
    action(type="omprog"
            binary="/usr/bin/python3 /home/elancao/Python/sendmail.py $msg")
}

我试图搜索 official doc

module(load="omprog")
action(type="omprog"
   binary="/path/to/log.sh p1 p2 --param3=\"value 3\""
   template="RSYSLOG_TraditionalFileFormat")

但在示例中,他们使用的是字符串 "p1",而不是动态参数。

你能帮忙吗?非常感谢!

omprog 的预期用途是让您的程序读取 stdin,它会在那里找到完整的默认 RSYSLOG_FileFormat 模板数据(带有日期、主机、标签、消息)。这很有用,因为这意味着您可以编写程序,使其只启动一次,然后它可以循环处理所有到达的消息。

这减少了为每条消息重新启动程序的开销,并使其反应更快。但是,如果您愿意,您的程序可以在读取一行后退出,然后 rsyslog 将重新启动它以获取下一条消息。 (您可能想要实施 confirmMessages=on)。

如果你只想要msg部分作为数据,你可以在操作中使用template=...来指定你自己的最小模板。

如果您确实必须将味精作为参数,您可以使用旧版过滤器语法:

^program;template

这将为每条消息 运行 program 一次,将其作为参数传递给模板的输出。这是not recommended.

如果 omprog 脚本没有执行或没有保存到文件,问题是:

  1. rsyslog 正在向该脚本发送完整消息,因此您需要定义或使用模板
  2. 你的脚本需要听 return

perl 中的 omprog 示例

#my $input = join( '-', @ARGV ); ///不工作我失去了 5 个小时的生命

我的 $input = ;现在这就是你需要的

希望这是 perl/python/rsyslog 社区所需要的。