zoukankan      html  css  js  c++  java
  • getopt解析命令行参数一例:汇集多个服务器的日志

         高效工作的一个诀窍就是尽可能自动化, 简便化。 比如, 公司里, 要搜索多个集群下的应用日志来排查问题, 需要使用 pssh:

             pssh -i -h api_hangzhou.iplist "grep  101-70795118 /path/to/info.2015-03-03.*.log"

             pssh -i -h api_hangzhou.iplist "grep  101-70795118 /path/to/info.log*"   

         

         这样有什么不方便呢?

                 1.  记忆日志路径不容易, 每次要粘贴, 你知道程序员的记忆力是不佳的;

                 2.  手工敲入命令太长, api_hangzhou.iplist 敲起来也比较费劲。 

                 3.  抓取不同日期, 不同子系统, 不同集群下的日志不够灵活。 有时, 难以确定是哪个集群, 就必须在所有集群下进行全遍历。

         

           总之, 程序员就是要懒, 尽可能消除不方便之处, 尽可能自动化,简便化。 因此,花了一天时间, 写了一个脚本来处理这个问题(话说我SHELL 也用的不熟啊, 不过是解决具体问题啦)。 具体用法如下:

                  usage: lg -k keyword -rregion -ddate

           其中, -k keyword 是内容关键字, -r, -d 都是可选的。 -r 若不指定为默认杭州集群; -d 若不指定为今天。

           最短命令可以为  lg -k keyword ,  在杭州集群今天的日志下搜索 keyword 的多个子系统的日志。

           

           当然, 该命令对于读者来说, 可能没有太多作用, 主要是做法值得借鉴。 编写类似脚本时, 可以借鉴下面的程序。 

           ln -s /home/qin.shuq/greplog /usr/local/bin/lg

           greplog 脚本:

    #!/bin/bash
    
    usage()
    {
        echo 'usage: lg -k keyword -rregion -ddate '
        echo '       lg --keyword keyword --region region --date date'
        echo '       lg -h or lg --help'
        echo 'desc:  grep api-regionmaster log by keyword in specified region in specified date.'
        echo 'options:'
        echo '       -k keyword [Required]: such as vmName, diskId, requestId '
        echo '       -r region  [Optional]: [h, hangzhou, hz, q, qingdao, qd, b,beijing, bj,  '
        echo '                               f,fujian, fj, shenzhen, sz, sichuan sc, a, all] ;'
        echo '                              if not specified, default: hz'
        echo '       -d date    [Optional]: such as 2015-02-14 ; '
        echo '                              if not specified, default to today '
        echo 'eg.    lg -k i-2503rpkgr -rhz -d2015-02-10'
        echo '       lg -k i-2503rpkgr                  '
        echo '       lg -k i-2503rpkgr -rhz             '
        echo '       lg -k i-2503rpkgr      -d2015-02-10'
        echo '       lg -k i-2503rpkgr -ra  -d2015-02-10'
        echo '       lg -h or lg --help'
    }
    
    if [ $# == 0 ]
    then
        usage
        exit 1
    fi
    
    TEMP=`getopt -o hk:r::d:: -l keyword:,region,date,help   -n '/home/qin.shuq/greplog' -- "$@"`
    if [ $? -ne 0 ]
    then
        usage
        exit 1
    fi
    
    eval set -- "${TEMP}"
    
    keyword=""
    region=""
    infolog=""
    
    
    while true ; do
       case "$1" in
           -k|--keyword)
               keyword="$2"
               shift 2
               ;;
           -r|--region)
               region="$2"
               shift 2 ;;
           -d|--date)
                if [[ $2 =~ ([0-9]{4}-[0-9]{2}-[0-9]{2}) ]]
                then
                    infolog="info.$2.log info.$2.*.log";
                else
                    infolog="info.log info.log.*"
                fi
                shift 2 ;;
           -h|--help)
                usage
                exit 0
                ;;
           --)
                shift
                break
                ;;
            ?) echo "Internal error!"
               exit 1
               ;;
        esac
    done
    
    if [[ $keyword = '' ]]
    then
        echo 'Error: Required parameter -k keyword not specified'
        usage
        exit 1
    fi
    
    if [[ $infolog = '' ]]
    then
        infolog="info.log info.log.*"
    fi
    
    case $region in
        h|hz|HZ|Hz|hZ|hangzhou)  region="hangzhou" ;;
        q|qd|QD|Qd|qD|qingdao)   region="qingdao" ;;
        b|bj|BJ|Bj|bJ|beijing)   region="beijing" ;;
        f|fj|FJ|Fj|fJ|fujian)    region="fujian" ;;
          sz|SZ|Sz|sZ|shenzhen)  region="shenzhen" ;;
          sc|SC|Sc|sC|sichuan)   region="sichuan" ;;
        a|all)                   region="hangzhou qingdao beijing fujian shenzhen sichuan" ;;
            *)                   region="hangzhou" ;;
    esac
    
    echo "keyword=$keyword, region=[$region], infolog=$infolog"
    
    iplistPath=/home/admin
    regionmasterLogPath=/home/admin/xxx
    apiLogPath=/home/admin/xxx
    
    for reg in $region ; do
        api_iplistFile="api_${reg}.iplist"
        for log in $infolog ; do
            echo "pssh -i -h $iplistPath/$api_iplistFile "grep $keyword $apiLogPath/$log""
            pssh -i -h $iplistPath/$api_iplistFile "grep  $keyword $apiLogPath/$log" | grep -v "FAILURE"
        done
    done
    
    for reg in $region ; do
        regionmaster_iplistFile=regionmaster_${reg}.iplist
        for log in $infolog ; do
            echo "pssh -i -h $iplistPath/$regionmaster_iplistFile "grep  $keyword $regionmasterLogPath/$log""
            pssh -i -h  $iplistPath/$regionmaster_iplistFile "grep  $keyword $regionmasterLogPath/$log" | grep -v "FAILURE"
        done
    done

         

  • 相关阅读:
    Flink基础之实现WordCount程序(Java版本多种写法)
    Redis 在Springboot 中反序列化 LocalDateTime 时报错
    JVM(五)- 堆
    JVM(四)- 虚拟机栈
    JVM(三)- 程序计数器(PC 寄存器)
    JVM(二)- 运行时数据区概述及线程
    JVM(一)
    phpstudy后门漏洞复现
    primefaces 5.x 表达式注入
    ueditor(v1.4.3)文件上传getshell实战复现
  • 原文地址:https://www.cnblogs.com/lovesqcc/p/4342980.html
Copyright © 2011-2022 走看看