最稳妥的 Nginx 日志轮转方案是用 logrotate 配合 USR1 信号:配置须放 /etc/logrotate.d/nginx(权限 644),路径、dateyesterday、sharedscripts 和 postrotate 中安全获取 PID 并 kill -USR1 缺一不可,上线前必须用 -d 和 -vf 手动验证。

直接在 /etc/logrotate.d/ 下为具体服务写配置文件,是最稳妥、最易维护的方式。不用动全局配置,也不用重启任何服务,改完就能验证。
明确日志路径和轮转触发条件
先确认你要管的日志在哪,比如 Nginx 默认是 /var/log/nginx/*.log,Tomcat 可能是 /opt/tomcat/logs/catalina.out。路径写错,logrotate 就完全不处理。
触发条件建议优先用 size,比时间更可靠:
-
size 100M:单个日志文件超过 100MB 就立即轮转(适合访问量波动大的服务) -
daily:每天固定时间轮转一次(适合日志增长平稳的场景) - 两者可共存,但 size 优先级更高,只要达到大小就立刻执行,不等周期
控制保留份数与压缩行为
避免“只切不删”,导致旧日志越积越多:
-
rotate 14:最多保留 14 个归档(比如access.log.1到access.log.14),超出自动删除 -
compress:启用 gzip 压缩,大幅节省空间 -
delaycompress:配合compress使用,让刚轮转出来的文件先不压缩,等下一轮再压——防止某些服务还在往旧文件里写(如未及时 reload 的 Nginx)
确保新日志可写、服务不中断
轮转后必须让服务知道该往新文件写了,否则日志会“消失”:
-
create 0644 www-data adm:轮转后自动创建新日志,设好权限和属主(Nginx 常用www-data,Tomcat 一般是tomcat用户) -
sharedscripts+postrotate ... endscript:保证脚本只执行一次(尤其多个日志文件时) - Nginx 示例:
kill -USR1 `cat /var/run/nginx.pid`—— 平滑重载,不中断连接 - Tomcat 如果是
catalina.out,没有内置重载机制,可用copytruncate(见下条)
特殊场景的兜底处理
有些服务不支持平滑重载,或者日志是 stdout/stderr 重定向来的(如 Docker 容器、systemd 服务),这时用:
-
copytruncate:先复制当前日志内容,再清空原文件。进程继续写原路径,无需通知,但有极小概率丢几行日志 -
missingok:日志文件不存在也不报错,避免配置文件生效早于服务启动 -
notifempty:空文件跳过轮转,省掉无意义操作











