Logrotate 未写入新的 .log 文件

Logrotate 未写入新的 .log 文件

我有 4 个自定义 systemd 服务,它们会写入 中的自定义日志/var/log/。我设置了一个logrotate配置文件,但它没有写入最新日志。它仍在写入旧.log.1文件。新的是创建,就是没有数据。

这是我的 logrotate 配置:

/var/log/dealer*.log {
        daily
        missingok
        rotate 7
        delaycompress
        notifempty
        su root root
        postrotate
        /bin/systemctl reload dealer*.service > /dev/null 2>/dev/null || true
        endscript
        create 0644 root root

}

最新的日志文件是空的:

-rw-r--r--  1 root      root               0 Jul 12 11:39 dealerF2f.log
-rw-r--r--  1 root      root               0 Jul 12 11:39 dealerOutbound.log
-rw-r--r--  1 root      root               0 Jul 12 11:39 dealerTimeout.log
-rw-r--r--  1 root      root               0 Jul 12 11:39 dealerWeb.log

它仍在写.log.1

-rw-r--r--  1 root      root             36M Jul 12 12:52 dealerOutbound.log.1
-rw-r--r--  1 root      root            9.2M Jul 12 12:52 dealerF2f.log.1
-rw-r--r--  1 root      root             19M Jul 12 12:52 dealerWeb.log.1
-rw-r--r--  1 root      root            171M Jul 12 12:52 dealerTimeout.log.1

答案1

通常,当某个进程仍然打开该文件时,我会看到类似的情况 - 它将继续写入旧文件,直到该进程重新启动。

我敢打赌,如果你重新启动而不是重新加载,它将按预期工作。

如果您无法完全重新启动该过程,请查看 copytruncate 选项而不是 postrotate 脚本。

copytruncate 在创建副本后将原始日志文件就地截断为零大小,而不是移动旧日志文件并可选地创建新日志文件。当某些程序无法被告知关闭其日志文件并因此可能继续永远写入(附加)到上一个日志文件时,可以使用此选项。请注意,复制文件和截断文件之间的时间间隔非常短,因此可能会丢失一些日志数据。使用此选项时,create 选项将不起作用,因为旧日志文件保留在原处。

相关内容