温馨提示×

Nginx日志分割策略有哪些

小樊
46
2025-10-25 18:55:00
栏目: 编程语言

Nginx日志分割的主要策略

1. 使用logrotate工具(系统级自动分割)

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缓解,但仍有极小概率丢失)。

2. 编写自定义脚本+定时任务(灵活可控)

通过Shell脚本实现日志切割,核心步骤包括:重命名原日志文件(如access.logaccess-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})

优点:灵活性强,可根据需求定制切割逻辑(如按小时、域名分割);缺点:需手动维护脚本和定时任务,维护成本略高。

3. 修改Nginx配置(内嵌时间变量)

通过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性能。

4. 使用第三方工具(如cronolog)

cronolog是专门用于日志分割的工具,支持按天、小时、分钟等粒度生成日志文件。使用时需修改Nginx配置,将日志输出到cronolog的管道或文件路径。
示例配置(nginx.conf):

access_log "|/usr/local/sbin/cronolog /var/log/nginx/access-%Y-%m-%d.log" main;

优点:轻量高效,专门为日志分割设计;缺点:需单独安装(如yum install cronologapt-get install cronolog),功能较logrotate单一(无压缩、保留数量控制等)。

5. 按域名/业务分割(精细化日志管理)

通过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(简单易用);大型项目推荐自定义脚本+定时任务(灵活可控);多站点项目推荐按域名分割(精细化分析)。

0