如何通过“file:”配置正确记录由 systemd 管理的服务日志

Hil*_*kus 14 logs logrotate systemd

我有一个由 systemd 管理的服务,它具有以下 systemd 配置,告诉 systemd 将日志直接写入文件(没有 syslog 或任何内容)

StandardOutput=file:/var/log/foo/my.log
Run Code Online (Sandbox Code Playgroud)

我有一个 logrotate 规则

/var/log/foo/*.log
{
        rotate 31
        daily
        missingok
        notifempty
        compress
        delaycompress
        sharedscripts
}
Run Code Online (Sandbox Code Playgroud)

发生的情况是日志正在轮换,但服务仍在写入旧的轮换文件,而新日志文件仍为空。

我有一个类似的工作设置,其中服务写入系统日志。这个工作正常,因为 logrotate 配置有

postrotate
                invoke-rc.d rsyslog rotate > /dev/null
Run Code Online (Sandbox Code Playgroud)

,它通知 syslog 它的日志已被轮换。

问题是,在我有问题的情况下,日志直接发送到文件,因此我不知道是否(或哪一个)需要向 systemd 或实际服务进程发送类似的信号。

我copytruncate在 logrotate 中找到了这个选项,我很确定它会解决我的问题,但我感觉这不是理想的方法,否则copytruncate将是 logrotate 的默认行为。

我该如何解决这个问题?我需要向 systemd 发送一些信号吗?我需要向服务进程发送一些信号吗?我必须copytruncate在 logrotate 中使用吗?
如果重要的话,该服务是一个使用 logback 写入 stdout 的 java 进程

小智 10

copytruncate在这种情况下是正确的答案。它不是默认值,因为很少需要它,因为您有一个适当的守护进程,您可以发出信号以重新打开日志文件。

另一种方法是在轮换后脚本中重新启动服务,但这可能不方便或不理想。