如何编写rainerscript
规则来记录到名称为 的子字符串的文件$programname
?
我想要一些符合这个伪规则的东西:
if $programname startswith "foo" then /path/to/<substring of $programname from 4 to end>
另外:有没有办法从$programname
写入文件的文本中去除“foo”前缀?
答案1
事实上,我对OP的评论感到无济于事。我做了更多测试,这是我想分享的可靠答案:
使用以下内容创建 /etc/rsyslog.d/00-local.conf:
template(name="AdminLog" type="string" string="/var/log/admin_%syslogtag:R,ERE,1,ZERO::(.*):--end%")
if ($programname == "admin") then {
action(type="omfile" dynaFile="AdminLog")
stop
}
systemctl restart rsyslog
logger -t admin:backup starting
这会导致 /var/log/admin_backup 获取日志。
笔记:
- 我正在运行 Ubunto 20.04。平台/版本特定的细微差别可能会影响您的结果。
- 所有更改和命令均已在 下完成
sudo -s
。 - 该模板不需要使用正则表达式。 '%property:Field' 表示法会更有效。这是为了演示如何使用更复杂的正则表达式。请参阅两者的语法财产替代者运营。
- 在 %syslogtag 的末尾看到附加了一个冒号并且需要在解析中容纳。
- 使用非常有帮助正则表达式测试页对于 Rsyslog。
- 在 /var/log 以外的文件夹中创建新文件会带来已知的复杂性,并且超出了 OP 请求的范围。让它适用于 /var/log 中的文件,然后单独接受挑战以使其适用于不同的文件夹。
- 请注意行动使用动态文件选项。
- 这也可以通过将结果模板到变量使用 exec_template 然后进一步操作它。这是一个示例页面。
- 使用 Rainerscript 执行正则表达式的另一种方法是使用重新提取函数。例子:
set $.thefunction = re_extract($syslogtag,...)