shell脚本实现 nginx日志切割

柳三千

文章最后更新时间:2025年06月11日

生产环境需求

  1. 每日切割Nginx日志,以时间戳命名保存
  2. 按月份归档日志,每个月的日志存放在独立文件夹

脚本实现步骤

1、创建日志存储目录

mkdir access_log

2、编写日志切割脚本

[root@WEB logs]# cat cut_nginx_log.sh  
#!/bin/bash
# 定义变量
dtime=$(date '+%Y%m')         # 年月文件夹名
date=$(date '+%Y%m%d')        # 日志备份文件名
backpath=/usr/local/nginx/logs/access_log/$dtime/$date  # 备份路径
logpath=/usr/local/nginx/logs/access.log               # 原始日志路径

# 检查月度文件夹是否存在,不存在则创建
if [ ! -d "/usr/local/nginx/logs/access_log/$dtime" ]; then
    mkdir -p /usr/local/nginx/logs/access_log/$dtime
fi

# 移动日志文件并触发Nginx重读日志
mv $logpath $backpath
kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid)

核心原理说明

  • kill -USR1 $(cat nginx.pid):向Nginx主进程发送USR1信号,触发日志重读与切割
  • 若缺少此命令,Nginx会继续向已备份的日志文件写入数据,新文件无内容

3、配置定时任务(crontab)

crontab -e

  • 示例定时任务:0 0 * * * /usr/local/nginx/logs/cut_nginx_log.sh
    (每天0点执行日志切割脚本)

优化建议

  1. 日志压缩:在脚本中添加压缩逻辑,减少存储空间
    gzip $backpath  # 压缩备份的日志文件
    
  2. 过期清理:添加月度日志清理逻辑,避免磁盘爆满
    # 清理3个月前的日志
    find /usr/local/nginx/logs/access_log -type d -mtime +90 -exec rm -rf {} \;
    
  3. 权限控制:确保脚本和日志目录有正确的读写权限
    chmod +x cut_nginx_log.sh  # 赋予脚本执行权限
    
文章版权声明:除非注明,否则均为柳三千运维录原创文章,转载或复制请以超链接形式并注明出处。

取消
微信二维码
微信二维码
支付宝二维码