# logrotate

> logrotate 的作用、/etc/logrotate.conf 和 /etc/logrotate.d 中的配置原理，以及如何安全地测试规则。

logrotate 是一个 Linux 工具，用于对日志文件进行轮转、压缩和删除，以防它们填满磁盘。它通常由 systemd 定时器或 cron 任务每天运行一次，读取 /etc/logrotate.conf 以及 /etc/logrotate.d/ 中的各软件包规则。

## 典型规则

规则指定了一个或多个日志文件以及诸如 daily 或 weekly（频率）、rotate 7（保留多少个旧文件）、compress（用 gzip 压缩旧文件）、missingok（文件不存在时不报错）、notifempty（跳过空日志）以及 postrotate ... endscript（轮转后运行的命令，例如重新打开日志）等指令。

## copytruncate

有些程序会持续写入同一个打开的文件。copytruncate 会复制日志然后截断原文件，而不是移动它，因此程序可以保留其文件句柄；在复制期间写入的少数几行可能会丢失。

## 测试

'logrotate -d /etc/logrotate.conf' 在调试模式下运行，仅打印将要发生的操作。'-f' 强制执行轮转，即使未到期也是如此。

## 如何添加和测试规则

1. 创建 /etc/logrotate.d/myapp 并写入日志路径和指令，例如 weekly、rotate 4、compress、missingok、notifempty。
2. 预演运行：sudo logrotate -d /etc/logrotate.d/myapp
3. 如果输出看起来正常，则强制执行一次轮转：sudo logrotate -f /etc/logrotate.d/myapp
4. 检查结果：查看日志目录的 ls -l。

## 注意事项

- 错误路径模式可能会轮转或删除其他程序的日志。
- 由 systemd journal 管理的日志在 journald.conf 中进行限制，而不是通过 logrotate。

## 资料来源

- [logrotate(8)](https://man7.org/linux/man-pages/man8/logrotate.8.html)
- [logrotate(8) (Debian)](https://manpages.debian.org/bookworm/logrotate/logrotate.8.en.html)

最后更新: 2026-10-08
URL: https://raincleaner.eu/zh/wiki/linux/logrotate
