logrotate 日志轮转配置详解
发布时间:2026-05-13 17:33       
更新时间:2026-05-14 08:53
/var 目录被日志撑爆的机器,翻一翻几乎都没有配 logrotate。它是绝大多数发行版自带的日志轮转工具,按天或按大小把旧日志切开压缩,配置一次就能常年不用管。
配置放哪
主配置在 /etc/logrotate.conf,业务配置放 /etc/logrotate.d/ 目录下,一个文件管一个服务。给自研应用写一个 /etc/logrotate.d/myapp:
/var/log/myapp/*.log {
daily
rotate 14
missingok
notifempty
compress
delaycompress
dateext
copytruncate
}
字段逐条过
daily 每天轮一次,量大的可改 hourly;rotate 14 保留 14 份,超出的删掉;missingok 日志不存在也不报错;notifempty 空文件不轮转;compress 对旧日志做 gzip 压缩;delaycompress 最新切出来的一份先不压,留给还在写入的进程;dateext 用日期当后缀(myapp.log-20261008),不写就是数字后缀,份数依然按周期计数。周期怎么选看用途:日志看近期,归档留底用月。
量特别大的日志可以加 maxsize 100M:到达阈值时即使没到周期也触发轮转。应用以普通用户运行、目录属主不是 root 的,加一行 su deploy deploy,避免轮转时权限混乱。/etc/logrotate.d 下的文件属主必须是 root、权限 644,被业务用户可写等于把系统日志的接管权交出去,安全扫描常盯着这一条。
copytruncate 给不肯重开日志文件的程序用:先复制再清空原文件。代价是复制与清空之间的那几行日志会丢,能接受再用;程序支持重开日志的话,标准做法是加 postrotate 段,里面写 systemctl reload myapp。
手动验证,别等凌晨出事
logrotate -d /etc/logrotate.d/myapp 是演练模式,只打印将做什么,不真执行,配置错误在这里就会暴露;确认无误后 logrotate -f /etc/logrotate.d/myapp 强制轮一次,ls 看看带日期后缀的文件是否生成、原文件是否清空。这一步值得单独强调:演练加强制轮转,五分钟就能把配置确认到位,比上线后凌晨报错划算得多。hourly 周期要配合 systemd timer 的场景,查发行版文档里的 logrotate.timer 说明。
它靠系统的 cron 或 systemd timer 每天触发,CentOS 上入口是 /etc/cron.daily/logrotate。轮转没按期执行,先查这个入口,再回头怀疑配置。