Rsyslog
如何在 rsyslog (RainerScript) 中設置和使用常量?
我正在編寫一個應用程序,其中包含一個 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 的值設置為您的實際站點名稱”*,而不是讓他擺弄文件的其餘部分。
過時
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 定義的其餘部分以了解整體情況。