Rsyslog

rsyslog 不寫動態日誌文件

  • April 16, 2020

我的 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 的文件

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

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

非傳統語法更明確一些,有時更易讀。您實際上正在使用內置的omfile模組。請注意,模板有兩種不同的用途:作為動態文件名,以及作為數據寫入的格式。但是,對於簡單的字元串,它們的定義方式相同,例如:

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=...關鍵字選項。即為寫入文件中的數據提供模板。

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