在 Linux 上想让日志只保留最近 7 天,最稳妥的方式是在 logrotate 配置中结合 daily 和 rotate 7,或者直接使用 maxage 7 指令,具体取决于你的系统版本和日志生成频率。
先说结论:配置 logrotate 时,使用 daily 配合 rotate 7 可近似保留 7 份备份,若需严格按天数清理,建议使用 maxage 7 参数。
- 适合:需要控制磁盘占用、防止日志无限增长的生产环境
- 先准备:确认 logrotate 已安装且配置文件路径正确
- 验收:通过调试模式确认配置语法无误,并检查状态文件
命令速用版
如果你已经知道要改哪个日志文件,可以直接编辑对应的配置文件,例如针对 Nginx 日志:
vim /etc/logrotate.d/nginx
在配置块中加入或修改以下行:
daily\nrotate 7\nmaxage 7\ncompress
修改后先不要直接生效,用调试模式检查:
logrotate -d /etc/logrotate.d/nginx
为什么会这样
日志文件如果不加限制,会随着时间无限变大,最终占满磁盘导致服务不可用。logrotate 是 Linux 发行版自带的标准工具,用来定期切割、压缩和清理旧日志。它默认按“份数”保留,但较新版本支持按“天数”清理。
分步处理
1. 找到配置文件:全局配置在 /etc/logrotate.conf,具体应用配置通常在 /etc/logrotate.d/ 目录下。
2. 编辑配置:确保包含 daily(每天切割)和 rotate 7(保留 7 份旧文件)。如果需要严格按天数删除,添加 maxage 7(删除超过 7 天的旧日志)。
3. 注意权限:配置中通常需要有 create 指令,指定新生成日志文件的权限和属主,否则服务可能无法写入新日志。
4. 调试检查:使用 logrotate -d 命令运行,它不会真正执行切割,只会输出预演结果,检查是否有报错。
怎么验证是否生效
查看状态文件 /var/lib/logrotate/status,里面记录了每个日志文件上次切割的时间。也可以手动强制运行一次 logrotate -f 看是否生成新文件,但生产环境慎用强制切割。
常见坑
1. rotate 7 不代表正好 7 天:如果日志是每天切一次,rotate 7 意味着保留最近 7 个备份文件,加上当前文件可能跨越 8 天。
2. 权限问题:切割后新生成的日志文件权限不对,导致服务写不进去,报错 Permission denied。
3. 空间不足:如果日志增长极快,一天内就填满磁盘,logrotate 可能来不及清理,需要配合 maxsize 使用。
参考来源
1. Linux Man Pages - logrotate(8)
URL: https://man7.org/linux/man-pages/man8/logrotate.8.html
2. Linux.die.net - logrotate man page
URL: https://linux.die.net/man/8/logrotate