在 Linux 下切割 Nginx 日志,常见做法有 logrotate(推荐)、手动脚本 + kill -USR1、Nginx 自带功能(有限)。下面按常用程度说明。
大多数 Linux 发行版都自带 logrotate,Nginx 通常也会自带配置。
cat /etc/logrotate.d/nginx
常见内容示例:
/var/log/nginx/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
endscript
}
daily:每天切割rotate 14:保留 14 份compress:压缩旧日志notifempty:空日志不切割kill -USR1:通知 Nginx 重新打开日志文件logrotate -d /etc/logrotate.d/nginx # 模拟
logrotate -f /etc/logrotate.d/nginx # 强制执行
#!/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
# 通知 Nginx 重新打开日志
kill -USR1 $(cat /var/run/nginx.pid)
crontab -e
0 0 * * * /usr/local/bin/cut_nginx_log.sh
Nginx 不会自动切割日志,只能:
kill -USR1 重新打开日志所以必须配合外部工具。
✅ 必须执行:
kill -USR1 `cat /var/run/nginx.pid`
确保:
logrotate 支持:
size 100M
或
daily
✅ 生产环境:logrotate
✅ 特殊需求:自定义脚本 + crontab
❌ 不建议依赖 Nginx 自身
如果你愿意,可以告诉我:
我可以给你一份可直接用的配置。