Logrotate 是 Linux 日志轮转核心工具,通过定时任务实现切割、压缩、清理和通知;配置分全局(/etc/logrotate.conf)与服务级(/etc/logrotate.d/);支持时间(daily/weekly)或大小(size +50M)触发,size 优先;关键动作含 create、copytruncate、postrotate 及 sharedscripts;调试需用 -d 模拟、-f 强制执行并检查状态文件与日志写入。

Logrotate 是 Linux 系统日志管理的核心工具,它不依赖服务常驻,而是通过定时任务自动完成日志切割、压缩、清理和通知,避免日志无限膨胀导致磁盘写满或分析困难。
配置文件结构与优先级
Logrotate 使用分层配置机制,主配置文件定义默认行为,子配置提供服务级定制:
-
/etc/logrotate.conf:全局策略,如
weekly、rotate 4、compress、include /etc/logrotate.d必须保留未注释 -
/etc/logrotate.d/ 目录下每个文件对应一个服务(如 nginx、mysql、myapp),内容为独立块,格式为:
/var/log/myapp/*.log {<br> daily<br> rotate 14<br> compress<br> delaycompress<br> missingok<br> notifempty<br> create 0640 myapp myapp<br> copytruncate<br>} - 子配置中定义的参数会覆盖全局配置;同一日志路径在多个配置中出现时,以最后加载的为准
按大小或时间触发轮转
轮转条件决定何时执行操作,二者可共存,但 size 优先级更高:
-
时间驱动:用
daily、weekly或monthly。适合写入节奏稳定的服务(如系统日志) -
大小驱动:用
size +50M(+ 表示“达到或超过”),适用于流量突增场景(如 API 网关、实时处理日志)。注意不能与daily同时用于同一块——若需双条件,应改用ifempty配合脚本逻辑 - 启用
dateext可让归档文件名带日期后缀(如access.log-20260828),替代数字序号,更利于人工识别
轮转后关键动作配置
仅切割日志不够,还需确保服务持续写入新文件并释放旧句柄:
- create 0640 user group:新建日志文件时设定权限和属主,防止因权限不足导致写入失败
- copytruncate:对无法接收信号重启的服务(如 Java 进程、某些守护进程)必需。先复制当前日志再清空原文件,有极小概率丢失正在写入的几行
-
postrotate / endscript:轮转完成后执行命令。典型用法是发送信号通知服务重开日志,例如:
postrotate<br> [ -f /var/run/nginx.pid ] && kill -USR1 $(cat /var/run/nginx.pid)<br>endscript
-
sharedscripts:当匹配多个日志文件(如
/var/log/nginx/*.log)时,保证postrotate只运行一次,避免重复 reload
调试与验证方法
配置写完不能直接上线,必须验证语法和效果:
- 用
logrotate -d /etc/logrotate.d/myapp查看模拟执行流程,确认是否匹配目标文件、是否满足条件、是否会触发压缩或 postrotate - 用
logrotate -f /etc/logrotate.d/myapp强制立即执行,观察/var/log/myapp/下是否生成新文件、旧文件是否重命名或压缩、权限是否正确 - 检查状态文件
/var/lib/logrotate/status,确认最新轮转时间戳是否更新 - 轮转后手动
ls -l /var/log/myapp/和tail -n1 /var/log/myapp/app.log,验证服务是否继续写入且无报错


















