logrotate 是 linux 中管理日志轮转的核心工具,依赖 cron 定时执行而非守护进程,通过 /etc/logrotate.conf 和 /etc/logrotate.d/ 下配置文件按周期(如 daily)判断并处理日志,支持压缩、归档、权限设置及服务重载。

Logrotate 是 Linux 系统中管理日志轮转最常用、最可靠的工具,它能自动压缩、重命名、删除旧日志,并按需创建新日志文件,避免磁盘被日志占满。关键不在于“能不能做”,而在于配置是否合理、触发是否及时、归档是否可追溯。
理解 Logrotate 的核心执行机制
Logrotate 本身不是守护进程,它依赖定时任务(通常是 cron)定期调用。系统默认一般通过 /etc/cron.daily/logrotate 每天凌晨运行一次。这意味着:日志不会实时滚动,而是按调度周期批量处理;单次运行会读取所有匹配的配置(/etc/logrotate.conf 及 /etc/logrotate.d/ 下的文件),逐个判断是否满足轮转条件(如大小、天数等)。
编写一个安全可靠的日志归档配置
推荐将项目日志配置单独放在 /etc/logrotate.d/myapp,避免污染主配置。以下是一个生产环境常用模板:
/var/log/myapp/*.log {
daily
missingok
rotate 30
compress
delaycompress
dateext
dateformat -%Y%m%d
create 644 www-data www-data
sharedscripts
postrotate
systemctl reload myapp.service > /dev/null 2>&1 || true
endscript
}
说明要点:
• daily 表示每天检查是否需要轮转,配合 dateext 生成带日期的归档名(如 app.log-20241015)
• rotate 30 保留最近 30 个归档文件,超出的自动删除
• delaycompress 延迟压缩——本次轮转不压缩,下次才压缩,确保 postrotate 中仍可读取原始日志
• create 在轮转后立即重建新日志文件,并设好权限和属主,避免应用因文件丢失或权限错误写日志失败
• sharedscripts + postrotate 保证脚本只在整个匹配块处理完后执行一次,适合 reload 服务
验证配置是否生效且无语法错误
直接运行命令测试比等 cron 更高效:
• logrotate -d /etc/logrotate.d/myapp:启用调试模式,显示详细判断逻辑(不实际执行)
• logrotate -f /etc/logrotate.d/myapp:强制执行一次,观察日志文件变化和归档结果
• 检查 /var/lib/logrotate/status,该文件记录每个日志上次轮转时间,是 logrotate 判断是否该轮转的依据
排查常见归档失败问题
如果日志没按预期归档,优先检查:
• 日志文件权限是否允许 logrotate 读写(尤其是 create 需要对目录有写权限)
• 应用进程是否独占打开日志文件(如未设置日志 reopen 机制),导致 logrotate 无法重命名原文件
• /etc/logrotate.conf 中的全局设置(如 weekly 或 size)是否与局部配置冲突
• cron 是否真正运行了 logrotate(查看 /var/log/syslog 或 journalctl -u cron 中相关记录)











