Rsyslog

如何在 rsyslog (RainerScript) 中設置和使用常量?

  • January 21, 2019

我正在編寫一個應用程序,其中包含一個 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 定義的其餘部分以了解整體情況。

引用自:https://unix.stackexchange.com/questions/439286