在 Nginx 中,按天分割日志通常有两种主流做法:
✅ 使用 logrotate(推荐)
✅ 使用定时脚本 + nginx reload
下面分别说明,并给出可直接用的配置示例。
which logrotate
vim /etc/logrotate.d/nginx
/var/log/nginx/*.log {
daily
rotate 30
missingok
notifempty
compress
delaycompress
dateext
dateformat -%Y%m%d
create 0640 www-data www-data
sharedscripts
postrotate
[ -s /run/nginx.pid ] && kill -USR1 $(cat /run/nginx.pid)
endscript
}
| 参数 | 说明 |
|---|---|
| daily | 每天切割 |
| rotate 30 | 保留 30 天 |
| dateext | 使用日期后缀 |
| -%Y%m%d | 如 access.log-20260121 |
| kill -USR1 | 通知 Nginx 重新打开日志文件 |
| compress | 压缩旧日志 |
logrotate -d /etc/logrotate.d/nginx # 模拟执行
logrotate -f /etc/logrotate.d/nginx # 强制执行
✅ 优点
适合自定义需求或容器环境。
vim /usr/local/bin/nginx_log_split.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
kill -USR1 $(cat /run/nginx.pid)
chmod +x /usr/local/bin/nginx_log_split.sh
crontab -e
0 0 * * * /usr/local/bin/nginx_log_split.sh
✅ 每天 0 点执行
Nginx 本身不支持按天自动切日志,只能通过:
access_log 指定文件名所以不能单独靠 Nginx 完成按天切割。
| 场景 | 推荐方式 |
|---|---|
| 生产服务器 | ✅ logrotate |
| Docker / 自定义 | 脚本 + crontab |
| 简单测试 | 脚本 |
kill -USR1?让 Nginx 重新打开日志文件,否则会继续写旧文件。
USR1如果你愿意,可以告诉我:
我可以帮你定制一套完全可用的配置。