必须将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:压缩开销可能超过节省的空间 - 如果服务不支持重载(比如某些 Java 应用),得用
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 任务会中断,后续所有配置都不执行。


















