Linux中Nginx 生成日志改为按天切割

发布于:2025-03-29 ⋅ 阅读:(30) ⋅ 点赞:(0)

在CentOS 7中,将Nginx日志按天切割可以通过以下步骤实现:


方法一:使用 logrotate(推荐)

  1. 确认Nginx日志路径 查看Nginx配置文件(如 /etc/nginx/nginx.conf),确认 access_logerror_log 的路径,通常为 /var/log/nginx/access.log/var/log/nginx/error.log

  2. 编辑或创建logrotate配置文件 打开或创建Nginx的logrotate配置文件(默认路径为 /etc/logrotate.d/nginx):

    sudo vi /etc/logrotate.d/nginx

    输入以下内容(如果文件已存在,调整参数即可):

    /var/log/nginx/*.log {
        daily              # 按天切割
        missingok          # 如果日志不存在,不报错
        rotate 7           # 保留最近7天的日志
        compress           # 压缩旧日志
        delaycompress      # 延迟一天压缩(与compress配合,压缩前一天的日志)
        notifempty         # 空日志不切割
        create 0640 nginx nginx  # 设置新日志文件的权限和所有者
        sharedscripts     # 所有日志处理完成后执行一次脚本
        postrotate
            # 发送USR1信号通知Nginx重新打开日志文件
            if [ -f /var/run/nginx.pid ]; then
                kill -USR1 `cat /var/run/nginx.pid`
            fi
        endscript
    }

  3. 测试logrotate配置 手动运行以下命令测试配置是否生效:

    sudo logrotate -vf /etc/logrotate.d/nginx
    • -v:显示详细过程。

    • -f:强制立即执行切割。

  4. 验证日志切割 检查 /var/log/nginx/ 目录是否生成类似 access.log-20231015.gz 的压缩文件。

  5. 确保logrotate定时任务生效 logrotate默认通过cron.daily每日运行,检查是否启用:

    ls /etc/cron.daily/logrotate


方法二:手动脚本 + Cron定时任务

  1. 编写切割脚本 创建脚本文件(如 /opt/nginx_logrotate.sh):

    #!/bin/bash
    LOG_DIR="/var/log/nginx"
    DATE=$(date -d "yesterday" +%Y%m%d)
    ​
    # 重命名日志文件
    mv ${LOG_DIR}/access.log ${LOG_DIR}/access_${DATE}.log
    mv ${LOG_DIR}/error.log ${LOG_DIR}/error_${DATE}.log
    ​
    # 通知Nginx重新打开日志文件
    kill -USR1 $(cat /var/run/nginx.pid)

  2. 赋予脚本执行权限

    sudo chmod +x /opt/nginx_logrotate.sh

  3. 添加Cron定时任务

    sudo crontab -e

    添加以下内容(每天0点执行):

    0 0 * * * /opt/nginx_logrotate.sh


注意事项

  • 日志权限问题:确保Nginx用户(如 nginx)对日志目录有写入权限。

  • 日志文件名格式:若需自定义日期格式(如 access_YYYY-MM-DD.log),可在脚本中调整 date +%F

  • 及时清理旧日志:通过 rotate 参数或脚本逻辑定期删除过期日志。

完成后,Nginx日志将按天切割并自动管理。推荐优先使用logrotate,因其与系统集成度高、维护更简单。