Nginx 日志切割 [转载]

配置了记录日志的nginx,在运行较长时间后,产生的日志文件(access.log)会越来越大。

日志文件过大会带来下面的问题:

  • 查询过大的日志文件对于开发和运维十分不方便,特别是加班人很累的情况下更加雪上加霜;
  • 很久以前的日志文件几乎没有价值,但是手工清理又太过繁琐;

这时候就需要一种解决方案可以自动来做日志分割,分割后的日志不仅“干净”,也便于实现日志定时清理。

由于目前的nginx使用docker部署,而公司的业务大都需要nginx始终运行,网上的“停nginx,分割,重启nginx”的方案并不适合,故对网上的方案进行了改进,使得目前的方案也能适应业务运行要求。

一、前提条件

  • 本次部署docker的选择centos 7

  • 本次nginx容器的日志文件持久化在宿主机的目录(/usr/local/docker/nginx_docker/logs)下

  • 本次每天0:00做日志切割,将切割后的日志文件(access.log、error.log)存放在宿主机的目录(/usr/local/docker/nginx_docker/logs-bak)下

  • 期望的日志备份目录结构:
    1级目录:4位年-2位月
    2级目录:4位年-2位月-2位日
    3级目录:存放切割后备份的日志文件

二、配置nginx切割日志

2.1 编辑div_nginx_log.sh

#在/usr/local/docker/nginx_docker目录下
touch div_nginx_log.sh

然后vim div_nginx_log.sh

#!/bin/bash

# 指定日志和切割后日志备份的目录
YEAR=$(date +%Y)
MONTH=$(date +%m)
DAY=$(date +%d)
YESTERDAY=$(date -d "yesterday" +%Y-%m-%d)
LOGS_PATH=/usr/local/docker/nginx_docker/logs
LOGS_BAK_PATH=/usr/local/docker/nginx_docker/logs-bak

# 得到1级目录名
if [[ $(($DAY)) -eq 1 ]]
  then
    if [[ $(($MONTH)) -eq 1 ]]
      then
        LOGS_BAK_PATH=$LOGS_BAK_PATH/$((${YEAR}-1))-12
    else
      if [[ $(($MONTH)) -gt 10 ]]
        then
          LOGS_BAK_PATH=$LOGS_BAK_PATH/${YEAR}-$((${MONTH}-1))
      else
          LOGS_BAK_PATH=$LOGS_BAK_PATH/${YEAR}-0$((${MONTH}-1))
      fi
    fi
else
    LOGS_BAK_PATH=$LOGS_BAK_PATH/${YEAR}-${MONTH}
fi

# 创建目录
mkdir -p $LOGS_BAK_PATH/${YESTERDAY}

# 复制当前的日志文件到备份的目录
cp ${LOGS_PATH}/access.log ${LOGS_BAK_PATH}/${YESTERDAY}/access_${YESTERDAY}.log
cp ${LOGS_PATH}/error.log ${LOGS_BAK_PATH}/${YESTERDAY}/error_${YESTERDAY}.log

# 清空日志
> ${LOGS_PATH}/access.log
> ${LOGS_PATH}/error.log

2.2 给bash添加执行权限

chmod 777 div_nginx_log.sh

测试脚本

bash div_nginx_log.sh

三、创建定时任务

vi /etc/crontab

将下面的内容添加到crontab文件中,wq保存。

# 每天0:00执行切割日志归档脚本
0 0 * * * root bash /usr/local/docker/nginx_docker/div_nginx_log.sh

重启crontab

systemctl restart crond

四、原文链接地址

转载自: https://www.cnblogs.com/straycats/p/9944081.html