本文详细介绍Nginx日志按日期分割的三种实用方案,包括Logrotate工具配置、crontab定时任务以及Nginx内置的$time_iso8601变量实现自动化分割,帮助运维人员有效管理日志文件并释放磁盘空间。
一、为什么需要分割Nginx日志
Nginx默认将访问日志(access.log)和错误日志(error.log)存储在单个文件中,长期运行会导致:
- 日志文件体积过大,影响读写性能
- 故障排查时难以定位特定时间段的日志
- 日志归档和清理操作困难
二、方案一:使用Logrotate工具
Linux系统自带的日志轮转工具,配置步骤如下:
创建Nginx专属配置文件
sudo vim /etc/logrotate.d/nginx
文件内容示例
/var/log/nginx/.log {
daily
missingok
rotate 30
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 30
:保留30个历史文件compress
:启用gzip压缩create
:设置新日志文件权限
三、方案二:crontab+Shell脚本
通过定时任务实现更灵活的控制:
!/bin/bash
日志目录
LOG_PATH=/var/log/nginx
获取昨天日期
YESTERDAY=$(date -d "yesterday" +%Y-%m-%d)
重命名日志文件
mv ${LOG_PATH}/access.log ${LOG_PATH}/access_${YESTERDAY}.log
mv ${LOG_PATH}/error.log ${LOG_PATH}/error_${YESTERDAY}.log
向Nginx主进程发送USR1信号重新打开日志文件
kill -USR1 $(cat /var/run/nginx.pid)
清理30天前的日志
find ${LOG_PATH} -name ".log" -mtime +30 -exec rm -f {} ;
设置每日执行的crontab任务:
0 0 /usr/local/scripts/nginx_logrotate.sh > /dev/null 2>&1
四、方案三:Nginx原生配置
修改nginx.conf实现启动即分割:
http {
log_format main '$remote_addr - $remote_user [$time_iso8601] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
access_log /var/log/nginx/access-${time_iso8601:0:10}.log main;
error_log /var/log/nginx/error-${time_iso8601:0:10}.log;
}
注意事项:
- 需要Nginx 1.11.8及以上版本
- 日期格式中的冒号(:)需要转义为${time_iso8601}
- 重启Nginx后生效
五、方案对比与选型建议
方案 | 优点 | 缺点 |
---|---|---|
Logrotate | 系统集成、配置简单 | 分割时间固定 |
Crontab | 灵活性高、可定制 | 需维护脚本 |
Nginx原生 | 实时分割、无需外部工具 | 版本要求高 |
对于生产环境推荐Logrotate方案,其具备成熟的日志压缩和过期清理功能,且与Linux系统深度集成。
六、日志分析建议
分割后的日志可配合以下工具进行分析:
- GoAccess:实时日志分析仪表盘
- ELK Stack:大规模日志分析系统
- AWStats:生成可视化统计报告
评论