我正在编写一个应用程序,其中包含一个 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
}
Run Code Online (Sandbox Code Playgroud)
这按预期工作。不幸的是,上述管道名称中的 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
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?我(想我)试过的所有变体$
,%…%
并%$…%
在Pipe="…"
部分,但没有奏效。ACTUAL_SITE
初始安装后从不改变的值。我只想为客户简化配置并说“将 ACTUAL_SITE 的值设置为您实际站点的名称”,而不是让他摆弄文件的其余部分。
小智 5
过时的rsyslog
版本(8.32 及更低版本)不支持您尝试执行的操作。
在当前的 rsyslog 版本中,您可以通过反引号常量来执行此操作,请参见此处。
这样做:
在 rsyslog 启动之前定义一个环境变量(或写入一个文件),通常是在目标机器上安装时将其添加到启动脚本中。让我们称之为 SITE_PIPE 并执行以下操作:
export SITEPIPE="/tmp/mysite/pipe"
Run Code Online (Sandbox Code Playgroud)然后,像这样使用反引号:
action(type="ompipe" Pipe=`echo $SITEPIPE` Template="my_fmt")
Run Code Online (Sandbox Code Playgroud)如果你写一个文件,你可以使用这个结构:
action(type="ompipe" Pipe=`cat pipenamefile` Template="my_fmt")
Run Code Online (Sandbox Code Playgroud)
所有这些对于 bash 的工作方式来说应该很熟悉。
可以在我们的 docker 容器中找到此操作的实际示例。这里链接到容器的rsyslog.conf。
但是您也可以查看其余的 Docker 定义以了解整体情况。
归档时间: |
|
查看次数: |
2113 次 |
最近记录: |