美文网首页
app日志清理压缩

app日志清理压缩

作者: 米开朗基乐 | 来源:发表于2020-01-16 07:39 被阅读0次
    #!/bin/bash
    # 获取昨天时间,时间格式: 2019-07-05
    date1=$(date -d -1days +%F)
    # 定义服务列表,每项代表一个服务
    app=('app1' 'app2' 'app3' 'app4')
    
    # 遍历服务列表
    for i in ${app[@]}
    do
      # 定义日志的路径,必须和实际的日志路径保持一致
      dir=/home/centos/$i/logs
      # 切换到指定服务日志的目录下
      cd $dir
      # 将catalina.out文件拷贝为catalina.2019-07-05,同时下一步操作把catalina.out文件清空,达到每天每天一个日志文件的效果
      # 如果日志已经是每天生成一个单独的文件,需要注释这两行
      cp catalina.out catalina.$date1
      echo '' > catalina.out
      # 将catalina.2019-07-05文件压缩成名为catalina.2019-07-05.tar.gz的归档文件,--remove-files是在压缩成功结束后,删除源文件
      tar -Pzcf catalina.$date1.tar.gz catalina.$date1 --remove-files
      # 删除当前服务日志目录30天之前的文件
      find $dir -atime +30 -exec rm -f {} \;
      #删除7天之前的log文件
      # find $dir -atime +7 -name "*log*" -exec rm -f {} \;
    done
    #00 00 * * * /to/path/clean_log.sh
    
    日志清理压缩脚本说明:
    1. 需要了解当前服务日志输出的文件名
    2. 将脚本中的服务列表更改为自己的服务对应的目录名,手动执行进行测试脚本能不能正常运行
    3. 给脚本添加执行权限(chmod +x clean_log.sh),添加到定时任务(crontab -e)
    4. 重启crond服务,确保crontab任务正常执行
    5. 当前服务器的脚本只能在当前服务器执行,不支持跨机器,多个服务器需要定义多个脚本
    
    

    or 2

    #!/bin/bash
    #funtion
    clean_log () {
      dir=/home/tomcat/$1/logs
      find $dir -atime +7 -exec rm -f {} \;
    }
    
    logs_ls () {
     dir=/home/tomcat/$1/logs
     sum=`ls $dir | wc -l`
     echo "$1 logfile count is [${sum}]"
    }
    
    list_tomcat=('flow' 'sso' 'utr' 'uc' 'bid' 'portal-xm' 'sso-xm' 'bid-xm' 'cms-xm' 'flow-xm' 'uc-xm' 'utr-xm' 'utrj-xm' 'portal')
    for i in ${list_tomcat[@]};
    do
     clean_log $i
     logs_ls $i
    done
    
    exit 0
    

    or 3

    #!/bin/bash
    date1=$(date -d -1days +%Y-%m-%d-%H_%M)
    #funtion
    clean_log () {
      dir=/home/tomcat/$1/logs
      cd $dir
      cp catalina.out catalina.$date1
      echo '' > catalina.out
      tar -Pzcf catalina.$date1.tar.gz catalina.$date1 --remove-files
      find $dir -atime +30 -exec rm -f {} \;
      find $dir -atime +7 -name "*log*" -exec rm -f {} \;
    }
    clean_log appa
    clean_log appb
    ...
    
    #!/bin/bash
    #可以tree到某一目录下所有的tomcat目录,新增或删减tomcat无需修改脚本文件,筛选条件需严格指定
    home_path=/home/tomcat
    all_dir=$(tree -Lf 2 ${home_path} | grep -E -v "logs|tar|dmp|bak|./jjdt|nx$|ah$|sz$|\.$|^$|tomcat$|directories" | awk '{print $NF}')
    clean_log () {
      dir=$1/logs
      find $dir -atime +7 -exec rm -f {} \;
    }
    
    logs_ls () {
     #dir=/home/tomcat/$1/logs
     sum=`ls $1/logs | wc -l`
     echo "$1 logfile count is [${sum}]"
    }
    
    #list_tomcat=('flow' 'sso' 'utr' 'uc' 'bid' 'portal-xm' 'sso-xm' 'bid-xm' 'cms-xm' 'flow-xm' 'uc-xm' 'utr-xm' 'utrj-xm' 'portal')
    for i in ${all_dir};
    do
     clean_log $i
     logs_ls $i
     #echo $i
    done
    

    (多个不同应用)

    #!/bin/bash
    date1=$(date -d -1days +%Y-%m-%d-%H_%M)
    app=('apache' 'tomcat1' 'tomcat2')
    for i in ${app[@]}
    do
    case $i in
    apache)
      dir=/usr/local/httpd/logs
      cd $dir
      cp mod_jk.log mod_jk.$date1
      echo '' > mod_jk.log
      tar -zcvf mod_jk.$date1.tar.gz mod_jk.$date1
      rm -f mod_jk.$date1
      #删除30天之前的文件
      find $dir -atime +30 -exec rm -f {} \;
    ;;
    *)
      dir=/home/sso/$i/logs
      cd $dir
      cp catalina.out catalina.$date1
      echo '' > catalina.out
      tar -zcvf catalina.$date1.tar.gz catalina.$date1
      rm -f catalina.$date1
      #删除30天之前的文件
      find $dir -atime +30 -exec rm -f {} \;
      #删除7天之前的log文件
      find $dir -atime +7 -name "*log*" -exec rm -f {} \;
    ;;
    esac
    done
    
    
    #!/bin/bash
    #00 00 * * * scriptname
    #将昨天的日志打包,传输给备份机,本地保留14个月的历史备份
    date1=$(date -d -1days '+%F_%T')
    date2=$(date -d -1days '+%F')
    bakPath=/home/nfcq/Logback
    scpAddress=192.168.100.118
    scpUsername=nq
    
    logType2=catalina.out
    logType3=catalina.${date1}.out
    logType3_1=catalina.${date1}.out.tar.gz
    
    logType4=catalina.${date2}.log
    logType5=host-manager.${date2}.log
    logType6=localhost.${date2}.log
    logType7=manager.${date2}.log
    
    logTypeflow=flow.log.${date2}
    logTypeportal=zbxsoft-portal.log.${date2} 
    logTypesso=passport.log.${date2}
    logTypeuct=zbxsoft.log.${date2}
    logTypeutrm=utrs.log.${date2}
    logTypeutrj_web=utrs.log.${date2}
    
    
    apacheCleanLog (){
      logDir=/home/apache2/logs
      scpBack=${bakPath}/${web_id}
      apacheLog=(error_log mod_jk.${date2}.log pbid.csuaee.com.cn-access${date2}.log sso.csuaee.com.cn-access${date2}.log xx.csuaee.com.cn-access${date2}.log jjdt.csuaee.com.cn-access${date2}.log utrj.csuaee.com.cn-access${date2}.log)
    
      cd ${logDir}
      for i in ${apacheLog[@]}
      do
        logType_apache=${i}.tar.gz
        tar -zcf ${logType_apache} ${i} --remove-files
        scp ${logType_apache} ${scpUsername}@${scpAddress}:${scpBack} 2>/dev/null
      done
      find ${logDir} -mtime +434 -exec rm -f {} \;
    }
    
    cleanLog (){
      app_id=${1}
      [[ -n ${app_id} ]] || exit;
      logDir=/home/nfcq/utrs/tomcat-${app_id}/logs
      export scpBack=${bakPath}/${app_id}
      cd $logDir
      cp ${logType2} ${logType3}
    #  echo '' > ${logType2}
      tar -Pzcf ${logType3_1} ${logType3} --force-local --remove-files
      #scp logfile
      scpLog
      #cleal logs 434 days(14 months) ago
      find $logDir -mtime +434 -exec rm -f {} \;
    }
    
    scpLog (){
      newLogType=logType${app_id}
      newLogType=$(eval echo '$'$newLogType)
      cd $logDir && if  stat ${newLogType} >/dev/null 2>&1;then :;else  mv "${newLogType} " ${newLogType};fi
      logtype=(${logType3_1} ${logType4} ${logType5} ${logType6} ${logType7} ${newLogType})
      for i in ${logtype[@]}
      do
        scp ${logDir}/${i} ${scpUsername}@${scpAddress}:${scpBack} 2>/dev/null
      done
      [[ ${app_id} == "utrj_web" ]] && scp ${logDir}/cmrsInfo.log.${date2} ${scpUsername}@${scpAddress}:${scpBack} 2>/dev/null
    }
    
    cleanLog flow
    cleanLog portal
    cleanLog sso
    cleanLog uct
    cleanLog utrm
    cleanLog utrj_web
    #apacheCleanLog 
    
    #!/bin/bash
    # 定时处理
    # 大小处理
    # oss
    # 处理后压缩删源
    
    # 假设任务每5分钟执行一次,脚步开始运行,处理一次日志不退出,内部循环每10s一次,判断日志大小,脚步运行到290s时,kill掉自己,等待定时任务下次执行
    
    # 获取主机名
    host_name=$(hostname)
    # 定义docker数据目录
    docker_var_path=/var/lib/docker
    # 定义docker日志目录
    docker_log_path=containers
    # 定义docker日志缓存目录
    docker_log_temp_path=docker_log_dir
    # 定义时间戳_2020-02-06_13-39-13
    log_tar_timestamp=$(date +%F_%H-%M-%S)
    # 定义日志操作类型,time为每次执行脚本时执行(crontab),size为脚本内循环执行
    type=time
    
    # 定义日志处理方法
    log_rodate(){
        # 查出当前的容器数
        container_list=$(ls ${docker_log_path})
        # 截取容器ID前12位和docker container ls校验,拿到容器名
        for container in ${container_list[@]};do
            container_log_name=${docker_log_path}/${container}/${container}-json.log
            container_sid=${container:0:12}
            container_name=$(docker container ls --filter id=${container_sid} --format '{{.Names}}')
            if [[ ${type} == "time" ]];then
                # 获取日志文件行数,文件判空处理
                if test -s ${container_log_name}; then
                    container_log_line=$(wc -l ${container_log_name} | awk '{print $1}')
                else
                    continue
                fi
            elif [[ ${type} == "size" ]];then
                ## 判断日志大小,处理日志
                container_log_size=$(ls -l ${container_log_name} | awk '{print $5}')
                # 文件大于5M
                if [[ 5000000 -le ${container_log_size} ]]; then
                    container_log_line=$(wc -l ${container_log_name} | awk '{print $1}')
                else
                    continue
                fi
            fi
            # 将总行数之前的日志输出到待处理日志文件中(保证输出过程中新日志的保留),删除刚刚的总行数,保留新产生的日志
            mkdir -p ${docker_log_temp_path}
            # sed的方式会改变文件的Inode,导致服务需要重启才能往文件里写日志
            # sed -n "1,${container_log_line}p" ${container_log_name} >> ${docker_log_temp_path}/${container_name}_${log_tar_timestamp}-json.log
            # sed -i "1,${container_log_line}d" ${container_log_name}
            # cat的方式可能会丢失cat和echo之间的日志
            cat ${container_log_name} >> ${docker_log_temp_path}/${container_name}_${log_tar_timestamp}-json.log
            echo -n "" > ${container_log_name}
            # 拼装日志归档名称,将待处理日志文件归档,删除源文件
            tar -zcf ${docker_log_temp_path}/${container_name}_${log_tar_timestamp}.tar.gz ${docker_log_temp_path}/${container_name}_${log_tar_timestamp}-json.log --remove-files
        done
    }
    
    
    ## 切换到数据目录
    cd ${docker_var_path}
    log_rodate
    
    ## 循环开始
    #日志类型切换为按size切割
    type=size
    num=0
    while((num < 29));
    do
        ## 睡眠时间
        sleep 10
        log_rodate
        ## 自增数
        let num=${num}+1
    done
    
    ## 拼装oss文件名,上传oss
    cd /tmp
    tar -zcf ${host_name}_docker_log_${log_tar_timestamp}.tar.gz ${docker_log_temp_path}/*${log_tar_timestamp}.tar.gz --remove-files
    yes | aliyun oss cp ${host_name}_docker_log_${log_tar_timestamp}.tar.gz oss://data-dump/
    

    相关文章

      网友评论

          本文标题:app日志清理压缩

          本文链接:https://www.haomeiwen.com/subject/sucbxftx.html