rsyslog 不寫入動態日誌文件

rsyslog 不寫入動態日誌文件

我的 Java 應用程式(在 Ubuntu 18.04 上)的 systemd 單元檔案似乎正在工作 - 我已將 stdout 和 stderr 設定為發送到 syslog,並且日誌條目出現在 /var/log/syslog 中。

但是我想使用動態名稱,因此我新增了 /etc/rsyslog.d/10-myapp.conf ,其中包含:

$CreateDirs on

:programname, startswith, "myapp-" {
  /var/log/apps/$programname.log
  stop
}

然後我重新啟動 rsyslog...並在目錄中得到一個名為 $programname.log 的檔案。

我懷疑我指定動態文件名的方式可能有問題 - 我看到其他地方的人使用選擇的不同語法訊息以及變數名稱周圍的 %...%。但是嘗試以下操作(並重新啟動 rsyslog)沒有幫助:

:programname, startswith, "myapp-" {
  "/var/log/apps/%programname%.log"
  stop
}

這給了我一個名為 %programname%.log 的文件

答案1

要使用動態文件名,您需要通過模板。這會命名字串(通常DynFile在範例中),並在使用時插入%property%字串中的值。要在舊語法中使用模板,您需要在其前面加上?.Try前綴

$template DynFile,"/var/log/apps/%programname%.log"
:programname, startswith, "myapp-" {
  ?DynFile
  stop
}

非遺留語法更加明確,有時也更具可讀性。您實際上正在使用內建的om檔案模組。小心,範本有兩種不同的用途:作為動態檔案名,以及作為要寫入的資料的格式。不過,對於簡單字串,它們的定義方式相同,例如:

template(name="myfile" type="string"
     string="/var/log/apps/%programname%.log")

if ($programname startswith "myapp-") then {
     action(type="omfile" dynaFile="myfile")
     stop
}

諸如此類的關鍵字dynaFile需要準確拼字。請注意,action()有一個template=...關鍵字選項。也就是為文件中寫入的資料提供一個模板。

相關內容