我正在编写一个应用程序,其中包含一个 rsyslog 配置,该配置放置在/etc/rsyslog.d/
.
某些日志消息应该重定向到命名管道,如下所示:
template (name="my_fmt" type="string" string="<%PRI%>%TIMESTAMP% %HOSTNAME% %syslogtag% %msg%\n")
if ( ... ) then {
action(type="ompipe" Pipe="/tmp/SITENAME/pipe" Template="my_fmt")
stop
}
这按预期工作。不幸的是,上述管道名称中的 SITENAME 事先是未知的,必须由客户配置。
我可以写这样的指令“在文件中查找任何出现的单词 SITENAME 并将其替换为您特定的 $sitename”甚至发出sed
命令,但我不喜欢这种方法。相反,我想在文件的开头设置一个常量,并在需要的地方使用它。就像这样:
set ACTUAL_SITE = "foo";
template (name="my_fmt" type="string" string="<%PRI%>%TIMESTAMP% %HOSTNAME% %syslogtag% %msg%\n")
if ( ... ) then {
action(type="ompipe" Pipe="/tmp/$ACTUAL_SITE/pipe" Template="my_fmt")
stop
}
我怎样才能做到这一点?我(想我)尝试了$
,%…%
和的所有变体,但没有一个%$…%
起作用Pipe="…"
。ACTUAL_SITE
初始安装后,的值不会改变。我只是想为客户简化配置并说“将 ACTUAL_SITE 的值设置为您的实际网站名称”不要让他摆弄文件的其余部分。
答案1
过时的rsyslog
版本(8.32 及更低版本)不支持您尝试执行的操作。
在当前的 rsyslog 版本中,您可以通过反引号常量来执行此操作,请参阅这里。
为此:
在 rsyslog 启动之前定义一个环境变量(或写入一个文件),通常是在目标计算机上安装时将其添加到启动脚本中。我们将此称为 SITE_PIPE 并执行以下操作:
export SITEPIPE="/tmp/mysite/pipe"
然后,使用反引号:
action(type="ompipe" Pipe=`echo $SITEPIPE` Template="my_fmt")
如果你写一个文件,你可以使用这个结构:
action(type="ompipe" Pipe=`cat pipenamefile` Template="my_fmt")
所有这些对于 bash 的工作原理应该很熟悉。
可以在我们的 docker 容器中找到实际的示例。这里链接到容器的rsyslog.conf。
但您也可以查看其余的 Docker 定义以了解全貌。