美文网首页运维监控
Linux三剑客(awk-7)-awk项目实战(统计日志错误级别

Linux三剑客(awk-7)-awk项目实战(统计日志错误级别

作者: 小胖学编程 | 来源:发表于2019-07-05 21:16 被阅读0次

    如何使用shell命令获取JSON串中的日志级别。进行统计呢?

    2019-07-05 13:52:23,505 [XX接口] [C201907051352239314]  : {"code":"2202","createDate":"2019-07-05 13:52:23","excType":"validateException","level":"warn","merchId":"AB20171101188709","msg":"系统异常","orderId":"T9292019070513****542","serviceId":"XXserviceId","serviceName":"XX接口","type":"user"}
    

    按照错误码的划分,可以将日志级别划分为informal [正常级别]、 warn [警告级别] 、error[错误级别]、fatal[致命级别]。

    但是数据是保存到JSON串中的,如何在JSON串中将数据取出来,并且进行汇总、排序、打印呢?

    #!/bin/sh
    
    fileName=$1
    level=$2
    
    echo "============================================"
    
    echo "[获取异常信息]-[参数准备]-[文件名]-[$fileName]"
    echo "[获取异常信息]-[参数准备]-[异常等级]-[$level]"
    
    echo "============================================"
    if [ -z "$fileName" ];then
    echo "[参数fileName为空]-[默认使用client-api-error.log]"
    fileName="client-api-error.log"
    fi
    
    echo "[获取异常信息]-[异常汇总]-[开始]"
    
     awk -F '("level":"|","merchId")' '{print $2}' ../log/$fileName | awk '/[^\s]$/{print $0}' | sort | uniq -c | sort -nr |
     awk 'BEGIN{printf "%s\n%s\n","异常类型统计-[开始]","[异常级别]-[数量]"} 
          {sum+=$1}  
          {printf "[%-8s]-[%-4s]\n",$2,$1} 
          END{  {printf "%s%s%s\n","[异常汇总]-[共统计异常",sum,"条]"}}'
    
    echo "[获取异常信息]-[异常汇总]-[结束]"
    
    echo "============================================"
      if [ -n "$level" ];then
        awk -v level=$level  '/'$level'/{print $0}' ../log/$fileName  >$level'.log'
        echo "[异常信息输出]-[错误日志已输出到 "$level".log文件中]"
      else
        echo "[无异常信息输出]"
      fi
    
    echo "============================================"
    
    
    效果图

    需要注意的:

    1. 如何精确得到汇总数据

    输出分割符可以和正则Pattern可以混合使用,进行精确切分。
    awk -F '("level":"|","merchId")' '{print $2}'实际上将日志切分成3段:

    2019-07-05 13:52:23,505 [XX接口] [C201907051352239314]  : {"code":"2202","createDate":"2019-07-05 13:52:23","excType":"validateException","level":"
    level
    ","merchId":"AB20171101188709","msg":"系统异常","orderId":"T9292019070513****542","serviceId":"XXserviceId","serviceName":"XX接口","type":"user"}
    
    1. 如何统计重复次数

    去重一般有两个命令:sort -u(niq)和uniq,但实际上使用uniq之前,也要进行一次sort命令。

    $ awk -F '("level":"|","merchId")' '{print $2}' client-api-error.log |sort|uniq -c
          8 
          1 error
          2 fatal
         12 informal
          2 warn
    

    使用-uniq -c(ount)命令,便可得到重复次数。

    1. 如何去重空行

    依旧使用awk 的正则pattern,在正则中\s代表的是空白,那[^\s]便是非空白,即我们要输出的行。

    4. 如何统计一列的数据值

    我们知道,shell中awk命令是逐行执行。那么实际上

    awk命令

    若一列中有4行,那么红框中的内容会执行4次。而非一次,本质上就是一个循环。我们我们便可以使用{sum+=$1},将每行的第一列汇总起来。

    相关文章

      网友评论

        本文标题:Linux三剑客(awk-7)-awk项目实战(统计日志错误级别

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