• nginx 日志切割(也适用于docker)


    ===============================================

    2019/4/6_第2次修改                       ccb_warlock

     

    2019/4/6:修复原先脚本无法正确保存日志的问题;

    ===============================================

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

     

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

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

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

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


    一、前提条件

    • 本次部署docker的基础os选择centos 7
    • 本次通过swarm的stack方式部署了nginx容器(https://www.cnblogs.com/straycats/p/9388219.html
    • 本次nginx容器的日志文件持久化在宿主机的目录(/usr/docker-vol/nginx/logs)下
    • 本次每天0:00做日志切割,将切割后的日志文件(access.log、error.log)存放在宿主机的目录(/usr/docker-vol/nginx/logs-bak)下
    • 期望的日志备份目录结构:
      1级目录:4位年-2位月
      2级目录:4位年-2位月-2位日
      3级目录:存放切割后备份的日志文件

     


    二、配置nginx容器的日志切割

    2.1 编辑cutlogs.sh

    mkdir -p /opt/sh
    vi /opt/sh/cutlogs.sh

     # 将下面的内容添加到cutlogs.sh内,wq保存。

    #!/bin/bash
    
    # 指定日志和切割后日志备份的目录
    YEAR=$(date +%Y)
    MONTH=$(date +%m)
    DAY=$(date +%d)
    YESTERDAY=$(date -d "yesterday" +%Y-%m-%d)
    LOGS_PATH=/usr/docker-vol/nginx/logs
    LOGS_BAK_PATH=/usr/docker-vol/nginx/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}/admin_access.log ${LOGS_BAK_PATH}/${YESTERDAY}/admin_access_${YESTERDAY}.log
    cp ${LOGS_PATH}/error.log ${LOGS_BAK_PATH}/${YESTERDAY}/error_${YESTERDAY}.log
    
    # 清空日志
    > ${LOGS_PATH}/access.log
    > ${LOGS_PATH}/admin_access.log
    > ${LOGS_PATH}/error.log

    2.2 给cutlogs.sh增加权限

    chmod 777 /opt/sh/cutlogs.sh

    PS.在创建定时任务之前,可以用下面的命令先试验脚本是否存在问题

    bash /opt/cutlogs.sh

    三、创建定时任务

    3.1 编辑crontab 

    vi /etc/crontab

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

    # 每天0:00执行该脚本
    0 0 * * * root bash /opt/sh/cutlogs.sh

    3.2 重启crontab

    systemctl restart crond

     

    根据这个方案切割后的日志文件会根据这样的结构进行存放。


    后话:

     不停机做日志切割可能会出现日志记录丢失的情况(即拷贝走、清空源文件之间会有时间间隔),但是对于目前的业务,一天的日志信息量不大且丢失的日志对于整天的日志来说犹如沧海一粟,故现在先用这个方案来解决docker部署后的nginx日志切割。


    参考资料:

     1.http://www.cnblogs.com/wjoyxt/p/4757093.html

     2.https://blog.csdn.net/linglongwunv/article/details/5212700

     3.http://www.cnblogs.com/wjoyxt/p/4757093.html

     4.https://www.cnblogs.com/aaronLinux/p/7074725.html

  • 相关阅读:
    Linux系统模拟端口开放程序port 软件的基本使用
    Docker19.03.13离线安装-Docker根目录-Docker常用操作--NVIDIA Docker
    springboot项目启动与停止命令
    两种设备选型的主要性能指标
    docker nginx配置
    使用shell+java 抓取NHK广播
    小程序的测试方法
    adb logcat 查看Android APP日志
    IE11判断是否全是中文的时候无效写法
    C#控制器微信通过encryptedData,iv,Code获取用户信息
  • 原文地址:https://www.cnblogs.com/straycats/p/9944081.html
Copyright © 2020-2023  润新知