Nginx 本身不会自动切割日志,通常借助 logrotate 或 自定义脚本 + cron 来实现日志切割。下面给你几种常见、可用的配置方式。
一般 Nginx 日志在 /var/log/nginx/,新建配置文件:
vim /etc/logrotate.d/nginx
内容示例:
/var/log/nginx/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 0640 nginx nginx
sharedscripts
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
}
daily:每天切割rotate 30:保留 30 天compress:压缩旧日志notifempty:空日志不切割kill -USR1:通知 Nginx 重新打开日志文件(关键)logrotate -d /etc/logrotate.d/nginx # 模拟执行
logrotate -f /etc/logrotate.d/nginx # 强制执行
vim /usr/local/bin/nginx_log_cut.sh
#!/bin/bash
LOG_PATH=/var/log/nginx
DATE=$(date -d "yesterday" +%Y%m%d)
mv $LOG_PATH/access.log $LOG_PATH/access.$DATE.log
mv $LOG_PATH/error.log $LOG_PATH/error.$DATE.log
kill -USR1 $(cat /var/run/nginx.pid)
# 可选:删除 30 天前的日志
find $LOG_PATH -name "*.log" -mtime +30 -delete
赋予执行权限:
chmod +x /usr/local/bin/nginx_log_cut.sh
crontab -e
0 0 * * * /usr/local/bin/nginx_log_cut.sh
Nginx 支持:
access_log /var/log/nginx/access.log;
但必须配合 kill -USR1 或 nginx -s reopen 才能实现日志轮转。
✅ 切割后日志不写新文件
→ 忘记执行 kill -USR1
✅ 权限错误
→ 确保 Nginx 用户有写权限
✅ Docker 环境
→ 建议在宿主机做 logrotate,或使用 logging 驱动
如果你告诉我:
我可以给你更精确的配置示例。