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 进行安全重载,这样在日志分割完成后,Nginx 服务也能平滑接管新的日志文件。

必须把配置文件放到 /etc/logrotate.d/ 目录下,否则 cron 默认不会执行它。
logrotate 配置文件应该放在哪里、系统如何加载
logrotate 不会在整个系统中自动搜索配置文件,它通常只读取两个固定位置:/etc/logrotate.conf(主配置文件)以及 /etc/logrotate.d/ 目录中的配置。Linux 系统每天会通过 /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,在部分 Linux 发行版中可能会被静默忽略
如何为 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行获取真实路径,能更好兼容不同的安装环境和部署方式
按大小切分和按时间切分有什么区别,参数怎么选
如果日志增长速度不稳定(例如白天访问量高、夜间几乎没有日志),仅使用 daily 可能会在某些时段切出空文件。这种情况下,通常更适合优先使用 size 触发轮转,例如 size +50M(注意单位必须是大写 M,小写 m 会直接报错)。
两种方式可以同时使用:
daily和size +50M同时配置时,只要满足任一条件,就会触发日志轮转rotate 7控制的是归档保留数量,和daily并不是同一个概念——它表示“最多保留 7 个历史归档文件”,而不是“保留最近 7 天的日志”- 对于高频率但单文件较小的日志(例如 debug 级日志),要谨慎启用
compress:压缩消耗的 CPU 资源有时可能超过节省的磁盘空间 - 如果服务本身不支持重载(比如某些 Ja va 应用),就需要使用
copytruncate,但要注意它是通过复制后清空原文件来实现的,在这一过程中可能会丢失少量日志内容
如何调试并验证 logrotate 配置是否生效
不要等到第二天再观察结果,建议先在本地或服务器上验证配置:
- 语法检查:
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 任务中断,进而影响后续所有日志轮转配置的执行。
