在 Linux 下对 Nginx 日志进行切割,常见做法有以下几种,从最推荐到手动方案依次说明。
logrotate(系统自带,自动化)通常 Nginx 已自带配置:
/etc/logrotate.d/nginx
如果没有,可新建:
vim /etc/logrotate.d/nginx
示例配置:
/var/log/nginx/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 0640 nginx nginx
sharedscripts
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
endscript
}
logrotate -d /etc/logrotate.d/nginx # 模拟执行
logrotate -f /etc/logrotate.d/nginx # 强制执行
✅ 优点:
vim /usr/local/bin/cut_nginx_log.sh
内容:
#!/bin/bash
LOG_PATH=/var/log/nginx
DATE=$(date -d "yesterday" +%Y-%m-%d)
mv $LOG_PATH/access.log $LOG_PATH/access.log-$DATE
mv $LOG_PATH/error.log $LOG_PATH/error.log-$DATE
# 通知 nginx 重新打开日志
kill -USR1 $(cat /var/run/nginx.pid)
# 压缩旧日志(可选)
gzip $LOG_PATH/access.log-$DATE
gzip $LOG_PATH/error.log-$DATE
赋予执行权限:
chmod +x /usr/local/bin/cut_nginx_log.sh
crontab -e
每天 0 点执行:
0 0 * * * /usr/local/bin/cut_nginx_log.sh
DATE=$(date +%Y-%m-%d-%H)
size 100M
Nginx 不会自动新建日志文件,必须通过:
kill -USR1 `cat /var/run/nginx.pid`
通知 Nginx 重新打开日志文件,否则还会写入旧文件。
❌ 直接 rm 日志 → 磁盘不释放
❌ 忘了 kill -USR1 → 日志写不进去
❌ 权限错误 → nginx 无法写新日志
| 场景 | 推荐方式 |
|---|---|
| 生产环境 | ✅ logrotate |
| 自定义逻辑 | shell + crontab |
| 简单测试 | 手动 mv + USR1 |
如果你愿意,我可以:
直接把你的 Nginx 日志路径贴出来即可。