• logrotate日志切分


    logrotate是一个日志切分工具,十分有用,它可以自动对日志进行截断(或轮循)、压缩以及删除旧的日志文件。例如,你可以设置logrotate,让/var/log/nginx日志文件每10天轮循,并删除超过7天的日志。配置完后,logrotate的运作完全自动化,不必进行任何进一步的人为干预。下面是例子

    我们去编辑/etc/logrotate.d/nginx.conf

    注意,如果你的/etc/logrotate.conf配置文件中配置了include才可以使用.d下的文件,nginx.conf是我们自己创建的文件,里面第一行写的就是监控的日志路径

    /var/log/nginx/access.log{
      dateext
      dateformat .web
      daily
      rotate 1441
      copytruncate
      compress
      notifempty
      missingok
      size 1M
      lastaction
        cd /var/log/nginx/
        for i in $(seq 1 10)
        do
        if [ ! -f "access.log.web.gz" ]; then
          sleep 3s
        fi
        done
        mv ./access.log.web.gz ./access.log.web.`date +%Y%m%d-%H:%M:%S`.gz
        if [  ! -f `ls access_[0-9]*.log &> /dev/null` ]; then
          gzip nginx_error_[0-9]*.log
        fi
        rm -f ./nginx_error_[0-9]*.log
      endscript
    }

    常见参数如下,另外在lastaction和endscript中间可以编辑我们要执行的动作

    配置参数

    说明

    compress                

    通过gzip压缩转储以后的日志

    nocompress              

    不压缩

    copytruncate            

    用于还在打开中的日志文件,把当前日志备份并截断

    nocopytruncate          

    备份日志文件但是不截断

    create mode owner group 

    转储文件,使用指定的文件模式创建新的日志文件

    nocreate                

    不建立新的日志文件

    delaycompress           

    和 compress 一起使用时,转储的日志文件到下一次转储时才压缩

    nodelaycompress         

    覆盖 delaycompress 选项,转储同时压缩。

    errors address          

    专储时的错误信息发送到指定的Email 地址

    ifempty                 

    即使是空文件也转储,这个是 logrotate 的缺省选项。

    notifempty              

    如果是空文件的话,不转储

    mail address             

    把转储的日志文件发送到指定的E-mail 地址

    nomail                  

    转储时不发送日志文件

    olddir directory         

    转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统

    noolddir                

    转储后的日志文件和当前日志文件放在同一个目录下

    prerotate/endscript     

    在转储以前需要执行的命令可以放入这个对,这两个关键字必须单独成行

    daily                   

    指定转储周期为每天

    weekly                  

    指定转储周期为每周

    monthly                 

    指定转储周期为每月

    rotate count            

    指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5 个备份

    tabooext [+] list

    让logrotate不转储指定扩展名的文件,缺省的扩展名是:.rpm-orig, .rpmsave, v, 和 ~

    size size               

    当日志文件到达指定的大小时才转储,bytes(缺省)及KB(sizek)或MB(sizem)

    missingok

    在日志轮循期间,任何错误将被忽略,例如“文件无法找到”之类的错误。

    然后我们可以在编写一个脚本可以对切割出来的一个个小tar包进行整合打包上传等操作,如下:

    其中:

    $1=日志目录

    $2=备份目录

    $3=app的名字,可以随便写,只是为了标识作用,也可以不要$3

    $4=日志类型,因为本程序有docker和nginx两个日志,所以用$4的值来进行区分

    $5=logrotate切割出来的小tar包要保存的天数

    $6=合并logrotate切割出来的小tar包要保留的天数

    [root@VM-0-15-centos ~]# cat test.sh
    #!/bin/bash
    if [ $1 ]
    then
      logdir=$1
      echo "log_addr is : $logdir "
    else
      echo "Err: 1st param log_addr is null "
      exit
    fi
    if [ $2 ]
    then
      bakdir=$2
      echo "bakup_addr addr :$bakdir "
    else
      echo "Err:2nd param bakup_addr is null "
      exit
    fi
    if [ $3 ]
    then
      app_log_name=$3
      echo "appname is :$app_log_name "
    else
      echo "Err: 3rd param appname is null "
      exit
    fi
    if [ $4 ]
    then
      logtype=$4
      echo "logtype is :$logtype"
    else
      echo "Err: 4th param logtype is null "
      exit
    fi
    
    
    if [ $5 ]
    then
      del_before_days="+$5"
      echo "del_before_days is :$del_before_days"
    else
      echo "Err: 5th param del_before_days is null "
      exit
    fi
    
    if [ $6 ]
    then
      del_bak_days="+$6"
      echo "del_bak_days is :$del_before_days"
    else
      echo "Err: 6th param del_bak_deys is null "
      exit
    fi
    
    
    
    
    #echo 'chmod 755 '$1' '
    #sudo chmod -R  777 $1
    ip=`hostname`
    ret_name=${app_log_name}_${ip}_${logtype}_`date  +"%Y%m%d" -d  "-1 days"`.gz
    echo "package name :"$ret_name
    # 推nas盘进行清理
    echo "rm file 7 days ago , rgx : "${app_log_name}_${ip}_${logtype}*.gz
    find $bakdir -mtime $del_bak_days -name "${app_log_name}_${ip}_${logtype}*.gz" -exec rm -rf {} ;
    #find $bakdir -mtime +7 -name "${app_log_name}_${ip}_${logtype}*.gz"
    cd $logdir
    if [ "$logtype"i = nginxi ]
    then
      [ -n  "`ls access_[0-9]*.log  2>/dev/null `" ] && gzip -f access_[0-9]*.log && rm -f ./access_[0-9]*.log
      [ -n  "`ls error_[0-9]*.log  2>/dev/null `" ] && gzip -f error_[0-9]*.log && rm -f ./error_[0-9]*.log
      echo 'package nginx log to '$ret_name
      #把切分的日志打包成一个包
      find ./ -mtime 1 | grep ".gz" | xargs tar -czvf $ret_name
      #删除自定义天数以前的小包
      find ./ -mtime $del_before_days | grep ".gz" | xargs rm -rf && echo "success delete $del_before_days gz!!"
      #old
      #[ -n  "`ls ./nginx_*.gz  2>/dev/null `" ] && tar -czvf $ret_name ./nginx_*.gz --remove-files || { echo 'no nginx file to package, bye'; exit; }
    elif [ "$logtype"i = dockeri ]
    then
      echo 'package docker log to '$ret_name
      #[ -n  "`ls ./*/*.gz  2>/dev/null `" ] && tar -czvf $ret_name ./*/*.gz --remove-files || { echo 'no docker file to package, bye' && exit; }
      find ./*/ -mtime 1 | grep ".gz" | xargs tar -czvf $ret_name
      find ./*/ -mtime $del_before_days | grep ".gz" | xargs rm -rf && echo "success delete $del_before_days gz!!"
    else
      echo 'err: not found log type'
      exit;
    fi
    # 移动到nas盘
    mv -f $ret_name $bakdir
    echo 'mv file '$ret_name' to '$bakdir
  • 相关阅读:
    Datawhale编程实践(LeetCode 腾讯精选练习50)Task11
    Datawhale编程实践(LeetCode 腾讯精选练习50)Task10
    Datawhale编程实践(LeetCode 腾讯精选练习50)Task9
    Datawhale编程实践(LeetCode 腾讯精选练习50)Task8
    Datawhale编程实践(LeetCode 腾讯精选练习50)Task7
    Java多线程之三volatile与等待通知机制示例
    Java多线程之一
    [WC2021] 括号路径
    [CF1375H] Set Merging
    [CF1342E] Placing Rooks
  • 原文地址:https://www.cnblogs.com/fengzi7314/p/14184892.html
Copyright © 2020-2023  润新知