我的 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=...
关键字选项。也就是为文件中写入的数据提供一个模板。