logrotate是Linux系统自带的日志管理工具,也是Nginx日志分割的主流方案。它支持按**时间(daily/weekly/monthly/yearly)或文件大小(size)**触发切割,可配置保留日志数量(rotate)、压缩旧日志(compress)、创建新日志文件(create)及权限设置(如create 0640 nginx adm)。切割后通过postrotate脚本向Nginx主进程发送USR1信号,通知其重新打开日志文件,避免日志写入中断。
示例配置(/etc/logrotate.d/nginx):
/var/log/nginx/*.log {
daily # 每天切割
rotate 7 # 保留最近7天日志
compress # 压缩旧日志(如.gz格式)
missingok # 忽略缺失日志文件
create 0640 nginx adm # 创建新日志文件并设置权限
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
endscript
}
优点:系统原生支持,自动化程度高,无需修改Nginx配置;缺点:需依赖系统crontab定时任务,切割瞬间可能有短暂日志丢失(可通过copytruncate替代create缓解,但仍有极小概率丢失)。
通过Shell脚本实现日志切割,核心步骤包括:重命名原日志文件(如access.log→access-2025-10-24.log)、清理旧日志(如find命令删除30天前日志)、通知Nginx重新打开日志(kill -USR1)。脚本需添加到crontab中定时执行(如每天00:00)。
示例脚本(/usr/local/nginx/sbin/cut_nginx_logs.sh):
#!/bin/bash
LOG_PATH="/data/nginx/logs"
YESTERDAY=$(date -d "yesterday" +%Y-%m-%d)
PID_FILE="$LOG_PATH/nginx.pid"
# 重命名access和error日志
mv ${LOG_PATH}/access.log ${LOG_PATH}/access-${YESTERDAY}.log
mv ${LOG_PATH}/error.log ${LOG_PATH}/error-${YESTERDAY}.log
# 删除30天前日志
find ${LOG_PATH} -name "*.log" -mtime +30 -exec rm -rf {} \;
# 通知Nginx重新打开日志
kill -USR1 $(cat ${PID_FILE})
优点:灵活性强,可根据需求定制切割逻辑(如按小时、域名分割);缺点:需手动维护脚本和定时任务,维护成本略高。
通过Nginx的$time_iso8601内置变量(格式:YYYY-MM-DDTHH:MM:SS+08:00)提取时间,配合map或正则表达式生成动态日志文件名,实现日志按时间自动分割(无需外部工具)。
http {
map $time_iso8601 $logdate {
'~^(?<ymd>\d{4}-\d{2}-\d{2})' $ymd;
default 'date-not-found';
}
access_log /var/log/nginx/access-$logdate.log main;
open_log_file_cache max=10;
}
server {
if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})") {
set $year $1;
set $month $2;
set $day $3;
set $hour $4;
}
access_log /var/log/nginx/access-$year-$month-$day-$hour.log;
}
优点:无需额外工具,切割逻辑与Nginx集成;缺点:日志文件数量随时间快速增长,需配合清理脚本(如find命令);部分配置(如if语句)可能影响Nginx性能。
cronolog是专门用于日志分割的工具,支持按天、小时、分钟等粒度生成日志文件。使用时需修改Nginx配置,将日志输出到cronolog的管道或文件路径。
示例配置(nginx.conf):
access_log "|/usr/local/sbin/cronolog /var/log/nginx/access-%Y-%m-%d.log" main;
优点:轻量高效,专门为日志分割设计;缺点:需单独安装(如yum install cronolog或apt-get install cronolog),功能较logrotate单一(无压缩、保留数量控制等)。
通过Nginx的$host内置变量(请求的域名),将不同域名的日志分开存储,适用于多站点服务器。配置示例如下:
server {
listen 80;
server_name example.com;
access_log /var/log/nginx/example.com-access.log main;
# ...
}
server {
listen 80;
server_name api.example.com;
access_log /var/log/nginx/api.example.com-access.log main;
# ...
}
优点:日志按域名分类,便于针对性分析(如某域名访问量、错误率);缺点:需提前知道所有域名,新增域名需修改配置。
以上策略可根据服务器规模、运维需求选择:小型项目推荐logrotate(简单易用);大型项目推荐自定义脚本+定时任务(灵活可控);多站点项目推荐按域名分割(精细化分析)。