Nginx 日志按日期分割的配置方式

2025.5.30 杂七杂八 638

Nginx 日志按日期分割的配置方式

本文详细介绍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:生成可视化统计报告

评论