
我的 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=...
關鍵字選項。也就是為文件中寫入的資料提供一個模板。