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

相关内容