Nginx本身不提供内置的日志切割功能,但可以通过以下几种方式实现日志切割:
logrotate是Linux系统自带的日志管理工具,配置简单可靠。
/etc/logrotate.d/nginx
)/var/log/nginx/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
}
配置参数说明:
- daily
:每天轮转
- missingok
:如果日志文件不存在也不报错
- rotate 14
:保留14个旧日志文件
- compress
:压缩旧日志
- delaycompress
:延迟压缩前一个日志文件
- notifempty
:空日志文件不轮转
- create 0640 www-data adm
:创建新日志文件的权限和所有者
- sharedscripts
:所有日志处理完再执行脚本
- postrotate
:轮转后执行的命令(通知Nginx重新打开日志文件)
logrotate -d /etc/logrotate.d/nginx # 测试模式
logrotate -f /etc/logrotate.d/nginx # 强制执行
/usr/local/bin/nginx_logrotate.sh
#!/bin/bash
# 定义日志目录和文件名
LOGS_PATH=/var/log/nginx
YESTERDAY=$(date -d "yesterday" +%Y-%m-%d)
# 切割access.log和error.log
for LOGNAME in access error
do
mv ${LOGS_PATH}/${LOGNAME}.log ${LOGS_PATH}/${LOGNAME}_${YESTERDAY}.log
done
# 通知Nginx重新打开日志文件
kill -USR1 $(cat /var/run/nginx.pid)
# 可选:压缩旧日志
find ${LOGS_PATH} -name "*.log" -mtime +7 | xargs gzip
chmod +x /usr/local/bin/nginx_logrotate.sh
crontab -e
添加以下内容(每天0点执行):
0 0 * * * /usr/local/bin/nginx_logrotate.sh
http {
log_format timed_combined '$remote_addr - $remote_user [$time_iso8601] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
access_log /var/log/nginx/access-$year-$month-$day.log timed_combined;
}
注意:这种方法需要Nginx编译时添加--with-http_geoip_module
或--with-stream_geoip_module
模块支持。
kill -USR1 $(cat /var/run/nginx.pid)
对于大流量网站,建议使用logrotate的dateext
选项按日期命名日志文件
确保Nginx进程用户对日志目录有写权限
定期清理旧日志,避免磁盘空间不足
在生产环境推荐使用logrotate方案,它是系统级的标准解决方案,稳定性有保障