shell日志生成工具

**功能点:

  • 自动创建日志目录和文件
  • 在需要生成日志的shell中添加
  • 自动删除时间较长的日志文件
  • 生成日志目录级别和源代码目录级别一致**
  • 传入参数不限
  • 具体使用方法和bash/sh 相似
#! /bin/bash -x

function sskj_bash (){
  echo "输入参数个数是:$#"
  echo "输入的参数是:$@"
  PRJ_NAME="/wmt-data"  #项目工程名
  JOB_NAME=`basename $0 .sh`
  curr_date=`date +%Y%m%d`
  curr_time=`date +%H%M%S`

  if [ $# -eq 0 ];then #判断参数个数是不是为0
         echo "参数异常,须输入需要执行的shell以及需要的参数,执行方式:sskj_bash "'${CURR_DIR}'"/test2.sh "'$start_date'" "'$end_date'""
  else
      tt="${@: -1}"
      if [ "${tt}" = "&" ];then   #判断尾参是不是&
              if [ $# -eq 1 ];then   #判断尾参是&并且个数为1
                echo "不能只输入&,请输入其他有效参数"
               else
                      declare -r CURR_DIR=$(cd `dirname $0`;pwd)
                      echo "参数个数为:$#,且最后一个参数是&"
                      # ${file#*/}:删掉第一个 / 及其左边的字符串
                      TASK_NAME=$1
                      # TASK_NAME=${TASK_NAME##*/}
                      TASK_DIR=${TASK_NAME#*${CURR_DIR}/}
                      TASK_DIR=${TASK_DIR%.*}
                      echo "**********TASK_DIR:$TASK_DIR"
                      # ${file##*/}:删掉最后一个 /  及其左边的字符串
                      TASK_NAME=${TASK_NAME##*/}
                      TASK_NAME=${TASK_NAME%.*}
                      echo "**********TASK_NAME:$TASK_NAME"

                      # 日志存放目录
                      # ${file#*/}:删掉第一个 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt
                      FILE_DIR=${CURR_DIR#*$PRJ_NAME}
                      LOG_DIR=${CURR_DIR%$PRJ_NAME*}$PRJ_NAME"-logs"${FILE_DIR}/${TASK_DIR}
                      if [ ! -d "${LOG_DIR}" ]; then
                        echo "LOG_DIR==="$LOG_DIR
                        echo "mkdir -p ${LOG_DIR}"
                        mkdir -p "${LOG_DIR}"
                        echo "创建日志根目录完成"
                      fi
                      logdir="${LOG_DIR}"
                      #logdir="${LOG_DIR}"
                      if [ ! -d "${logdir}" ]; then
                        mkdir -p $logdir
                      fi
                      logfile="${TASK_NAME}_${curr_date}.log"
                      filepath="${logdir}/${logfile}"
                      file_bak="${filepath}_bak_${curr_date}_${curr_time}"
                      if [ -f "${filepath}"  ]; then
                          mv $filepath $file_bak
                      fi
                      >${logdir}/${logfile}

                      ## 删除日志目录下30天前的日志文件
                      find ${logdir} -type f -mtime +30 -exec rm -rf {} \;
                      #加入输入3个参数
                      cn_t=1
                      para_args=""
                      for element in "$@";{
                        if [ $cn_t -lt $# ];then
                           if [ $cn_t -eq 1 ] ;then
                               para_args="$para_args"$element
                               let cn_t+=1
                             else
                               para_args="$para_args "$element
                               let cn_t+=1
                           fi
                        fi
                       }
                  echo "*******nohup bash $para_args >> $filepath 2>&1 &*******"
                  start_dt=`date +'%Y-%m-%d %H:%M:%S'`
                  start_seconds=$(date --date="$start_dt" +%s)

                  nohup bash $para_args >> $filepath 2>&1 &
                  wait
                  end_dt=`date +'%Y-%m-%d %H:%M:%S'`
                  end_seconds=$(date --date="$end_dt" +%s);
                  echo "任务开始时间:${start_dt}">>$filepath
                  echo "任务结束时间:${end_dt}">>$filepath
                  echo "任务执行时间:"$((end_seconds-start_seconds))"s">>$filepath

               fi
      else
         echo "有效参数个数为:$#"
          declare -r CURR_DIR=$(cd `dirname $0`;pwd)
          # ${file#*/}:删掉第一个 / 及其左边的字符串
          TASK_NAME=$1
          # TASK_NAME=${TASK_NAME##*/}
          TASK_DIR=${TASK_NAME#*${CURR_DIR}/}
          TASK_DIR=${TASK_DIR%.*}
          echo "**********TASK_DIR:$TASK_DIR"
          # ${file##*/}:删掉最后一个 /  及其左边的字符串
          TASK_NAME=${TASK_NAME##*/}
          TASK_NAME=${TASK_NAME%.*}
          echo "**********TASK_NAME:$TASK_NAME"

          # 日志存放目录
          FILE_DIR=${CURR_DIR#*$PRJ_NAME}
          LOG_DIR=${CURR_DIR%$PRJ_NAME*}$PRJ_NAME"-logs"${FILE_DIR}/${TASK_DIR}
          if [ ! -d "${LOG_DIR}" ]; then
            echo "LOG_DIR==="$LOG_DIR
            echo "mkdir -p ${LOG_DIR}"
            mkdir -p "${LOG_DIR}"
            echo "创建日志根目录完成"
          fi
          logdir="${LOG_DIR}"
          #logdir="${LOG_DIR}"
          if [ ! -d "${logdir}" ]; then
            mkdir -p $logdir
          fi
          logfile="${TASK_NAME}_${curr_date}.log"
          filepath="${logdir}/${logfile}"
          file_bak="${filepath}_bak_${curr_date}_${curr_time}"
          if [ -f "${filepath}"  ]; then
              mv $filepath $file_bak
          fi
          >${logdir}/${logfile}

          ## 删除日志目录下30天前的日志文件
          find ${logdir} -type f -mtime +30 -exec rm -rf {} \;

          cn_t=1
          para_args=""
          for element in "$@";{
             if [ $cn_t -eq 1 ] ;then
                 para_args="$para_args"$element
                 let cn_t+=1
               else
                 para_args="$para_args "$element
                 let cn_t+=1
             fi
           }

      echo "*******nohup bash $para_args >> $filepath 2>&1*******"
      start_dt=`date +'%Y-%m-%d %H:%M:%S'`
      start_seconds=$(date --date="$start_dt" +%s)
      nohup bash $para_args >> $filepath 2>&1
      wait
      end_dt=`date +'%Y-%m-%d %H:%M:%S'`
      end_seconds=$(date --date="$end_dt" +%s);
      echo "任务开始时间:${start_dt}">>$filepath
      echo "任务结束时间:${end_dt}">>$filepath
      echo "任务执行时间:"$((end_seconds-start_seconds))"s">>$filepath
    fi
  fi
}

针对上段生成的 日志,如果有datax,sqoop导出数据的记录:可以查出导出数据量

#! /bin/bash -x
function check_data (){
declare -r CURR_DIR=$(cd `dirname $0`;pwd)
PRJ_NAME="/wmt-data"  #项目工程名
JOB_NAME=`basename $0 .sh`
curr_date=`date +%Y%m%d`
curr_time=`date +%H%M%S`
TASK_NAME=$1
# TASK_NAME=${TASK_NAME##*/}
# ${file##*/}:删掉最后一个 /  及其左边的字符串
TASK_DIR=${TASK_NAME#*${CURR_DIR}/}
TASK_DIR=${TASK_DIR%.*}
echo "**********TASK_DIR:$TASK_DIR"
# ${file##*/}:删掉最后一个 /  及其左边的字符串
TASK_NAME=${TASK_NAME##*/}
TASK_NAME=${TASK_NAME%.*}
echo "**********TASK_NAME:$TASK_NAME"
# 日志存放目录
FILE_DIR=${CURR_DIR#*$PRJ_NAME}
# ${file%/*}:删掉最后一个  /  及其右边的字符串:/dir1/dir2/dir3}
LOG_DIR=${CURR_DIR%$PRJ_NAME*}$PRJ_NAME"-logs"${FILE_DIR}/${TASK_DIR}
logdir="${LOG_DIR}"
logfile="${TASK_NAME}_${curr_date}.log"
filepath="${logdir}/${logfile}"
echo "日志读取目录:$filepath"
group=${2:-"wmt运维"}
num=${3:-"8"}
TASK_NAME=${4:-$TASK_NAME}
tmpfile=`mktemp -t log_XXXX.txt`
cat $filepath | egrep '读出记录总数|读写失败总数|Exported|任务执行时间' > $tmpfile
mached=`cat $tmpfile`
if [ "$mached" != "" ];then
   if [[ "$mached" =~ "Exported" ]];then
        list=""
        while read line
        do
        list="$list:"$line
        done<$tmpfile
        echo "list:$list"
        finished=`echo $list|awk -F ":" '{print $5}'`
        echo $finished
        finished=`echo $finished|awk -F " " '{print $2}'`
        dt=`echo $list|awk -F ":" '{print $7}'`
        echo "finished:$finished"
        echo "dt:$dt"
          if [ "$finished" = "" ];then
                echo "alert_dw -t wework -g "$group" -j "$TASK_NAME" -m '"$TASK_NAME "任务没有找到导出记录数,请查原因~~~' -o "$num""|sh
           else
                echo "alert_dw -t wework -g "$group" -j "$TASK_NAME" -m '"$TASK_NAME "任务导出成功,共有"${finished}"条记录,本次任务用时"${dt}"' -o "$num""|sh
           fi
       else
          list=""
          while read line
          do
          list="$list:"$line
          done<$tmpfile
          finished=`echo $list|awk -F ":" '{print $3}'`
          errored=`echo $list|awk -F ":" '{print $5}'`
             if [ "$finished" = "" ];then
                 echo "alert_dw -t wework -g "$group" -j "$TASK_NAME" -m '"$TASK_NAME "任务没有找到导出记录数,请查原因~~~' -o "$num""|sh
             else
                 echo "alert_dw -t wework -g "$group" -j "$TASK_NAME" -m '"$TASK_NAME "任务导出成功, 共有成功"${finished}"条记录,失败"${errored}"条记录' -o "$num""|sh
             fi
      fi
    else
      echo "没有匹配到相关的日志信息"
fi
}

3.run_hive包装函数
功能描述:

  1. 根据 shell 路径和参数执行任务
  2. 如果遇到数据湖的 exception 之类的问题,首先是重跑任务,然后是跑出保存信息到企业微信
#!/bin/bash -x
function run_hive(){
  arguments=$*
  echo $arguments
  job_name=`echo $arguments | sed 's/.*-f\(.*\)\.sql.*/\1/g'`
  count=0

  # JOB执行失败重试过程,失败一分钟后重试
  while [ 0 -eq 0 ]
  do
    echo ".................. ${job_name##*/} start at `date "+%Y-%m-%d %H:%M:%S" `  ..................."

    start_at=`date +'%Y-%m-%d %H:%M:%S'`

    hive ${arguments}


    if [ $? -eq 0 ]; then
          end_at=`date +'%Y-%m-%d %H:%M:%S'`
          start_seconds=$(date --date="$start_at" +%s)
          end_seconds=$(date --date="$end_at" +%s)
          echo "--------------- ${job_name##*/} done at `date "+%Y-%m-%d %H:%M:%S" ` duration: "$((end_seconds-start_seconds))" s ---------------"
          break;
      else
          # 执行失败,重试
          count=$[${count}+1]
          # 指定重试次数,重试超过3次即失败
          if [ ${count} -eq 4 ]; then

              exit 10
              break
          fi
          echo "................${job_name##*/} after 60s retry .............."
          sleep 480
      fi
  done
}

# 功能简介: 输出日志到日志路径
# 参数简介:
#          $1:调度 shell 文件的路径
#          $2:开始时间参数
#          $3:结束时间参数
# 使用案例:
#          ss_logging /u/users/svccnahahs/prod/wmt-data/src/dwd/dwd_offline '2020-04-01' '2020-04-01'
function ss_logging(){

  if [ "$1"=="-h" ]; then 
   echo "功能简介: 输出日志到日志路径"
   echo "参数简介:"
   echo "          $1:调度 shell 文件的路径"
   echo "          $2:开始时间参数"
   echo "          $3:结束时间参数"
   echo " 使用案例:"
   echo "          ss_logging /u/users/svccnahahs/prod/wmt-data/src/dwd/dwd_offline '2020-04-01' '2020-04-01'"
   return  0 ;
  fi

  JOB_PATH=`dirname ${1}`
  JOB_NAME=`basename ${1}`
  JOB_NAME=${JOB_NAME//.sh/}
  curr_date=`date +%Y%m%d`
  curr_time=`date +%H%M%S`
  start_date=${2}
  end_date=${3}
  PRJ_NAME="/wmt-data"
  LOG_ROOT_DIR=${JOB_PATH%$PRJ_NAME*}$PRJ_NAME"-logs"
  if [ ! -d "${LOG_ROOT_DIR}" ]; then
    echo "LOG_ROOT_DIR==="$LOG_ROOT_DIR
    echo "mkdir -p ${LOG_ROOT_DIR}"
    mkdir -p "${LOG_ROOT_DIR}"
    echo "创建日志根目录完成"
  fi
  logdir="${LOG_ROOT_DIR}/${JOB_NAME}"
  if [ ! -d "${logdir}" ]; then
    mkdir -p $logdir
  fi
  logfile="${JOB_NAME}_${curr_date}.log"

  filepath="${logdir}/${logfile}"
  file_bak="${filepath}_bak_${curr_date}_${curr_time}"
  if [ -f "${filepath}"  ]; then
      mv $filepath $file_bak
  fi

  ## 删除日志目录下60天前的日志文件
  find ${logdir} -type f -mtime +90 -exec rm -rf {} \;
  bash -x ${JOB_PATH}/${JOB_NAME#*cron_}.sh ${start_date} ${end_date} >> $filepath 2>&1 &
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值