logrotate 的配置文件需要放到 /etc/logrotate.d/ 目录里,这一步不能放错。原因很直接:cron 实际上只会通过 /etc/cron.daily/logrotate 去调用 /etc/logrotate.conf,而后者又是靠 include /etc/logrotate.d 来加载具体配置的,换到其他路径,系统默认并不会识别。针对 Nginx 日志,通常要配上 daily、dateext、dateyesterday 和 dateformat -%Y-%m-%d,另外还得在 postrotate 里使用 kill -USR1 做安全重载,这样日志切分后服务本身也能平稳接管新文件。

必须把配置文件放到 /etc/logrotate.d/ 目录下,否则 cron 永远不会执行它。
logrotate 配置文件该放哪儿、怎么加载
logrotate 并不会去“满系统乱找”配置,它实际上只看两个固定位置:/etc/logrotate.conf(主配置文件)和 /etc/logrotate.d/ 目录下的所有配置。系统每天会通过 /etc/cron.daily/logrotate 这个脚本执行 logrotate /etc/logrotate.conf,而主配置里默认又写着 include /etc/logrotate.d。说白了,Nginx、MySQL 这类服务的日志轮转配置之所以要放进这个目录,原因就在这里。
常见错误:
- 把配置写在
/root/nginx.logrotate或/usr/local/etc/logrotate.d/nginx,手动运行logrotate -f成功了,就以为部署好了——其实 cron 根本看不到 - 给配置文件加
.conf后缀(比如nginx.conf),logrotate 会直接跳过它 - 权限不是
644、属主不是root:root,某些发行版会静默忽略
如何为 Nginx 日志配置按天切分并带日期后缀
关键不是只加 dateext,而是要配合 daily 和 dateyesterday 才能生成形如 access.log-2026-07-08 的文件名(即“昨天”的日期,语义更准确)。
示例配置(写入 /etc/logrotate.d/nginx):
/var/log/nginx/*.log {
daily
dateext
dateyesterday
dateformat -%Y-%m-%d
missingok
rotate 7
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
postrotate
pidfile=$(nginx -t 2>&1 | grep "pid" | awk '{print $NF}')
[ -f "$pidfile" ] && kill -USR1 $(cat "$pidfile")
endscript
}
注意点:
dateformat必须紧接dateext使用,且格式字符串前要带短横线(-%Y-%m-%d),否则生成的文件名可能缺分隔符postrotate里别用systemctl reload nginx:它会触发 worker 进程重启,有丢请求风险;kill -USR1是原子重开日志句柄,零停机pidfile路径不能硬编码——nginx -t输出里的pid行才是真实路径,兼容不同安装方式
按大小切分 vs 按时间切分,怎么选参数
如果日志增长不均匀(比如白天流量大、夜间几乎为零),单靠 daily 可能某天白切一次空文件;这时应优先用 size 触发,例如 size +50M(单位必须大写 M,小写 m 会报错)。
两者可以共存:
daily和size +50M同时存在时,满足任一条件即触发轮转rotate 7控制的是保留份数,和daily无关——它不是“保留最近 7 天”,而是“最多留 7 个归档文件”- 高频小日志(如 debug 级)慎用
compress:压缩开销可能超过节省的空间 - 如果服务不支持重载(比如某些 Ja va 应用),得用
copytruncate,但要注意:它靠复制+清空原文件实现,期间可能丢几行日志
调试和验证配置是否生效
别等第二天看效果,先本地验证:
- 语法检查:
logrotate -d /etc/logrotate.d/nginx—— 只打印动作,不真执行,重点看有没有 “error” 或 “skipping” - 强制立即执行:
logrotate -f /etc/logrotate.d/nginx—— 生产环境慎用,避免和 cron 冲突导致重复切割 - 查上次执行记录:
cat /var/lib/logrotate.status,确认对应日志路径的最后轮转时间 - 切完立刻检查:
ls -l /var/log/nginx/,看新文件权限是否是0640、旧文件名是否含日期、postrotate是否成功发信号(ps aux | grep nginx看 master 进程是否还在)
最容易被忽略的是 missingok:Nginx 刚装好还没产生日志时,没有它,整个 logrotate 任务会中断,后续所有配置都不执行。