Bash: shell脚本实现快速查看日志,这一刻心情真好

监控隔三差五写一小时,经历半个多月,终于完成了订单自动化

远程登录ssh

  1. 路由转发设置
  2. 旧电脑改造为centos

python自动化脚本

  1. 部署python3.6环境
  2. 部署项目
  3. 使用cron调度
  4. 重构代码适配cron运行方式

查看日志

  1. 编写shell脚本快捷命令

  2. 用过jlog命令可以快速查看运行日志

    #! /bin/sh
    
    FunctionHelp(){
        # jlog.sh 的使用说明
        if [[ $1 =~ (help|^\?$) ]];then echo "============= 使用帮助 jlog help|? by at 170809 ==================";
        else echo "提示:FAIL 命令错误,参数超过3个";fi
        echo ""
        echo "命令:jlog.sh [l|n|o|h|log|nohup|order|heart] [now/0|last/-1|all|170808] [500]"
        echo "参数:目录 dir -- 可选,预设目录可使用简称或全称,其他目录必须全称,默认值log"
        echo "参数:日期 date -- 可选,now/0当天,last/-1最后,all总日志,默认all,如处理Nohup,date可用2位以上数字表达年份"
        echo "参数:行数 count -- 可选,默认200"
        echo ""
        echo "日志:总路径 /data/testapplog"
        echo "日志:总日志 /data/testapplog/log -- 记录级别 Fail(warn) Error(warn) Exception(error) Traceback(error)"
        echo "日志:分路径 /data/testapplog/Nohup -- run.py运行日志"
        echo "日志:分日志 /data/testapplog/Nohup/Nohup -- 记录级别 无正常日志,无Traceback"
        echo "日志:天日志 /data/testapplog/Nohup/Nohup/1708/Nohup170808 -- 记录级别  正常和错误日志,异常日志,但不记Traceback"
        echo "日志:分路径 /data/testapplog/Order -- 下单监控日志"
        echo "日志:分路径 /data/testapplog/Heart -- 接口监控日志"
        echo ""
        echo "示例:查看log的200行 --- jlog"
        echo "示例:查看heart的总200行 --- jlog h"
        echo "示例:查看order的当天200行 --- jlog o 0"
        echo "示例:查看Nohup的当年500行 --- jlog n 0 500"
        echo ""
    }
    
    FunctionTest(){
        # 打印入参情况
        echo "function: ${FUNCNAME[@]}"
        echo "paras: $#个($*)"
        echo "paraDir: $paraDir"
        echo "paraDateType: $paraDateType"
        echo "paraCountInt: $paraCountInt"
    }
    
    UtilDirparaToDirname(){
        # 将参数转化为日志dir,入参dir
        if [ $1 == o ]||[ $1 == order ];then echo Order;return;
        elif [ $1 == h ]||[ $1 == heart ];then echo Heart;return;
        else echo $1;return;fi
    }
    
    UtilDirDateToLogfile(){
        # 根据dir和date确定通用类的logFile,入参pathDir,date
        dirMon=`date +%Y%m`
        logDay=`date +%Y%m%d`
        pathDir=$3/$1
        if [[ $2 =~ ^(all)$ ]];then echo ${pathDir}/$1;return;
        elif [[ $2 =~ ^(-1|last)$ ]];then echo `ls -t ${pathDir}/${dirMon}/$1* | head -1`;return;
        elif [[ $2 =~ ^(0|now)$ ]];then echo ${pathDir}/${dirMon}/$1${logDay};return;
        elif [[ $2 =~ ^0{,1}[0-9]+$ ]];then logDay=$2;echo ${pathDir}/${dirMon}/$1${dirMon}$2;return;
        else echo $3/$1/$1;return;fi
    }
    
    Tail(){
        # 查看日志的基本方法,入参logFile,count
        echo "查看日志:$1 最新$2行"
        tail -$2f $1
    }
    
    TailLog(){
        # log日志处理,入参dir,date,count,pathRoot
        dir=log
        logFile=$4/${dir}
        Tail ${logFile} $3  # 执行查看日志
    }
    
    TailNohup(){
        # Nohup日志处理,入参dir,date,count,pathRoot
        dir=Nohup
        if [[ $2 =~ ^[0-9]{2,}$ ]];then  # date为170808|17|1708,则取2017年的日志
            dirYear=`date +%Y`
            paraDate=$2
            fileName=${dir}${dirYear:0:2}${paraDate:0:2}
            logFile=$4/${dir}/${fileName}
        else   # date为其它,则取当年日志
            dirYear=`date +%Y`
            logFile=$4/${dir}/${dir}${dirYear}
        fi
        Tail ${logFile} $3  # 执行查看日志
    }
    
    TailDir(){
        # 通用dir目录类型的日志处理,入参dir,date,count,pathRoot
        dir=$(UtilDirparaToDirname $1)  # 确定dir目录
        logFile=$(UtilDirDateToLogfile ${dir} $2 $4)   # 确定logFile
        Tail ${logFile} $3  # 执行查看日志
    }
    
    ChooseTailFunction(){
        # 日志方法决策,入参dir,date,count,pathRoot
        if [ $1 == l ]||[ $1 == log ];then TailLog $*;  # log类日志
        elif [ $1 == n ]||[ $1 == nohup ];then TailNohup $*;    # Nohup类日志
        else TailDir $*;fi  # dir通用类日志
    }
    
    # 默认参数值
    paraDir=log
    paraDateType=all
    paraCountInt=200
    pathRoot=/data/testapplog
    
    # 入参赋值
    if [ $1 ];then paraDir=$1;fi
    if [ $2 ];then paraDateType=$2;fi
    if [ $3 ];then paraCountInt=$3;fi
    if [[ $1 =~ (help|^\?$) ]]||[ $# -gt 3 ];then FunctionHelp $1;exit 1;fi
    
    # 根据类型,判断执行不同的方法
    ChooseTailFunction ${paraDir} ${paraDateType} ${paraCountInt} ${pathRoot}
    
    # 调试代码
    #FunctionTest $*
    
    # 代码仓库 TailDir 里的dir过程旧代码
        # declare -l $1 # 转成小写
        # if [ $1 == o ]||[ $1 == order ];then dir=Order;
        # elif [ $1 == h ]||[ $1 == heart ];then dir=Heart;
        # else dir=$1;fi
    

远程登录后,jlog看到自动化在默默地跑,心情好!