Nginx 日志切割(按天/大小等)常见有 三种方式:logrotate(推荐)、手动脚本 + cron、Nginx 信号切割。下面按使用频率从高到低说明。
✅ 方式一:使用 logrotate(最推荐,生产常用)
1️⃣ 原理
logrotate 是 Linux 自带工具,可按天/大小自动切割、压缩、保留历史日志,并 reload nginx。
2️⃣ 配置示例
创建配置文件
vim /etc/logrotate.d/nginx
内容示例(按天切割)
/var/log/nginx/*.log {
daily
rotate 30
missingok
notifempty
compress
delaycompress
dateext
dateformat -%Y%m%d
create 0640 nginx nginx
sharedscripts
postrotate
systemctl reload nginx > /dev/null 2>&1 || true
endscript
}
3️⃣ 参数说明
| 参数 | 说明 |
|---|---|
| daily | 每天切割 |
| rotate 30 | 保留 30 天 |
| compress | 启用 gzip |
| dateext | 日志加日期 |
| postrotate | 切割后 reload nginx |
| missingok | 日志不存在不报错 |
4️⃣ 测试是否生效
logrotate -d /etc/logrotate.d/nginx # 模拟执行
logrotate -f /etc/logrotate.d/nginx # 强制执行
✅ 方式二:Nginx 信号切割(官方方式)
原理
- 重命名日志文件
- 发送
USR1信号让 nginx 重新打开日志
示例脚本
#!/bin/bash
LOG_PATH="/var/log/nginx"
DATE=$(date +%Y%m%d)
mv $LOG_PATH/access.log $LOG_PATH/access.log.$DATE
mv $LOG_PATH/error.log $LOG_PATH/error.log.$DATE
kill -USR1 $(cat /var/run/nginx.pid)
加入定时任务
crontab -e
0 0 * * * /bin/bash /usr/local/bin/nginx_log_cut.sh
✅ 适合自定义逻辑强的场景
✅ 方式三:按大小切割(不常用)
logrotate 本身就支持:
size 100M
示例:
/var/log/nginx/*.log {
size 100M
rotate 10
postrotate
systemctl reload nginx
endscript
}
✅ 推荐方案总结
| 场景 | 推荐方式 |
|---|---|
| 生产环境 | ✅ logrotate |
| 自定义脚本 | Nginx USR1 |
| 按大小 | logrotate + size |
✅ 常见问题
❓ 切割后日志不写新文件?
✅ 一定要 reload / USR1,否则 nginx 仍写旧 fd
❓ 日志名没有日期?
✅ 加:
dateext
dateformat -%Y%m%d
如果你愿意,可以告诉我:
- OS(CentOS / Ubuntu)
- Nginx 版本
- 日志路径
我可以帮你生成完全可用的配置。
