我有 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 选项将不起作用,因为旧日志文件保留在原处。