需求:

需要定期查找各个微服务Warnlog日志的ERROR,给到开发分析,已知的错误可以忽略,只找新出现的,如果是bug的就让开发排期解决,。

 

思路:

1、sync同步各个微服务上Warnlog日志到一台服务器上

2、将同一服务的不同节点日志,合并成一个日志文件

3、grep -v 排除已知可以忽略的错误信息

 

合并同步过来的日志

merge_warnlog.sh

[appdeploy@DeployServer sync-log]$ cat merge_warnlog.sh 
#!/bin/bash
 
read -p "Please input the time interval from now [default:720 min]:" t
 
logfiles=`find /app/sync-log/WarnLog/ -type f -mmin -${t}|sort`
for n in $logfiles
do
   echo $n
done
 
 
echo "###############过滤掉没有ERROR的文件###########################################"
 
>file2
 
for n2 in $logfiles
do
     res=`grep -w ERROR $n2|grep -v msg|wc -l`
     if [ $res != 0 ];then
         echo $n2|tee -a file2
     fi
done
 
 
echo "###############合并同一个服务的文件###########################################"
 
x=`awk -F "/" \'{gsub(/[1-9]+/,"",$5);print $5}\' file2|uniq`
for i in $x
do
  result=`echo $i | grep "_"|wc -l`
  ser_log=/app/sync-log/log/$i
  if [[ $result -eq 0 ]];then
        echo "$i服务"
        h=`grep $i file2|grep -v _`
  else
        echo "$i服务"
        h=`grep $i file2`
  fi
 
  for m in $h
   do
     echo "  " >>$ser_log
     echo "$i  " >>$ser_log
     echo "$m"|tee -a $ser_log
     echo "  " >>$ser_log
     cat -n $m >>$ser_log
   done
 
done
 
mv log/ana-data log/data

  

然后,排除已知和可以忽略的错误,减小排除范围。

#!/bin/bash
 
 
activity=\'"wwwww"\'
data=\'"DuplicateKeyException\|dispatcherServlet"\'
groupapi=\'"wwwww"\'
warehouse=\'"wwwwww"\'
groupsub=\'"qwer\|福利派发抛出异常"\'
base=\'"默认私钥解密\|获取网络图片资源异常\|用AES256解密"\'
groupadminapi=\'"msg\|导入收货人快递信息\|查询产品失败\|/supplyProduct/modIntroduce\|/mallRefund/agreeRefund\|/mall/product/bind"\'
group_fill_order=\'"创建补货需求出错\|该商品条码对应多种商品"\'
member=\'"messageShelfReminderDTO\|JSONException\|getWxUserInfo\|密码解密失败\|超时\|补交款订单已付款\|积分兑换扣除积分出错\|AsyncMessageTaskService\|添加积分返回值"\'
openapi=\'"请求超时\|/execute\|/msg/customer/reply\|FeignException: status 500\|/wxNotify/notifyContractPay\|/payBack/notify/WeiXinPayJSAPI/3\|/error"\'
order=\'"创建补货需求出错\|统一下单出错\|该商品条码对应多种商品\|申请电子发票用户信息异常\|推送订单失败\|获取招行公钥异常\|支付回调失败"\'
product=\'"ProductFillOrderItemExtendPO"\'
shelf=\'"未找到对应货道信息"\'
group_pay=\'"wwwwwww"\'
group_product=\'"qwer"\'
shopapi=\'"/product/getProduct"\'
webadmin=\'"BaseController.java:188\|用户手机号已经存在\|银行业务不支持\|查询商品库\|查询仓库信息失败\|用户名称已经存在\|QiniuUpload\|ExceptionHandlerExceptionResolver.java:324\|ShelfInspectionTaskController.java:559\|数据量超过\|银行卡号有误\|BaseController.java:187\|此用户丰声CODE已经存在\|查询盘点记录明细出错"\'
wxadminapi=\'"msg\|/shelf/logisticsTaskExecutor/uploadBackStockPic\|/myShelf/orderSign\|/user/wxUserinfo\|/myShelf/submitCheckProduct\|/prewarehouse/goodsTransfer/getPrewarehouseDetailIntersection\|/prewarehouse/goodsTransfer/listPrewarehouseGoodsTransferFillOrder\|/user/getBankCardInfo\|/user/getIdentityCardInfo\|/shelfManager/fillOrder/signShelfFillOrderFromPreWarehouse\|/shelfSaleStatistics/daySaleStatistics\|/myShelf/activate\|/myShelf/queryMyShelf\|/prewarehouse/shelfManagerApplyOrder/getShelfPrewarehouseProductSummary\|/shelf/goodsTransferShelf/signGoodsTransferOrder"\'
 
wxappapi=\'"msg\|/shelf/scanCode\|errMsg\|/foodCard/getBalance\|/payBack/notify/WeiXinPayJSAPI/goodsOrder\|/user/getUserBeanByThree\|优惠券\|根据货架随机码\|货架编码无效\|coupon/getUserCouponMsgNew\|qn-cdn-pic.feng2.com\|wxUserInfo\|/user/checkIn\|assembleShelfData\|ouponRecordDTO转gourmetFestivalVO失败\|/coupon/getCouponCentreCoupons\|/wx/getWxJsapiSignature\|/payBack/notify/cmbPay/goodsOrder\|/shelf/apply\|/copywriting/getCopywriting\|/orderPayment/cancel"\'
 
 
 
 
 
 
 
filerlog()
{
for i in `seq 1 20`
do
    echo -e "\e[40;35m 请输入想要过滤的值,或者按q退出 \e[40;37m"
    read -p  "$i:Please input filter value :" k
    if [ -z "${k}" ] ; then
        continue
    elif [ ${k} = "q" ] || [ ${k} = "Q" ] ; then
        break
    elif [ ${k} = "a" ] || [ ${k} = "A" ] ; then
        echo -e "\e[40;35m 请输入错误之后的多少行 \e[40;37m"
        read -p  "Please input after the few lines:" time line
        grep -w $time -A ${line:=7} log/$logfile
    else
        gre_e="$gre_e $gre_v $k"
        echo -e "\033[34m $gre_e  \033[0m"
        eval $gre_e
    fi
done
}
 
 
 
 
exit_log()
{
        read -n1 -p "press Key \"q\" to exit or any other Key to continue:" k
        echo ""
        if [ -z "${k}" ] ; then
            continue
        elif [ ${k} = "q" ] || [ ${k} = "Q" ] ; then
            break
        else
            continue
        fi
}
 
 
 
while :
do
    gre_e="grep -w ERROR"
    gre_v="|grep -v"
    select n in `ls log/`
      do
          logfile=$n
          eval pai=$(echo \$$logfile)
          gre_e="$gre_e log/$logfile $gre_v $pai"
          eval $gre_e
 
          filerlog
 
       break
    done
 
    exit_log
done

 

 

 

 

 收集分析访问日志,插入mysql脚本

[appdeploy@DeployServer scripts]$ cat fetch_api_data.sh
#!/bin/bash


lists=`grep api /app/deploy/scripts/distribute.cnf|grep -v -E "#|gray"|cut -d \| -f 3,8`

for p in $lists
do
    host_ip=`echo $p|cut -d \| -f 1`
    deploy_path=`echo $p|cut -d \| -f 2`
    echo $host_ip  $deploy_path
    
    ansible ${host_ip} -m copy -a "src=/app/deploy/scripts/api_perf_analyze.sh dest=${deploy_path} mode=0755"  -i /app/deploy/scripts/hosts
    ansible ${host_ip} -m shell -a "chdir=$deploy_path sh ${deploy_path}/api_perf_analyze.sh"  -i /app/deploy/scripts/hosts
    sleep 60s    
done

 

api_perf_analyze.sh

[appdeploy@DeployServer scripts]$ cat api_perf_analyze.sh
#!/bin/bash

access_file="access.`date -d "-1 day" +"%Y-%m-%d"`.log"

cat logs/${access_file}|grep -v HEAD |awk \
\'
{u=split($8,arr,"?");uri=arr[1];
 m=substr($2,1,5);
 muri=m","uri;
if(max[muri] + 0 < $12 +0 )
  {max[muri]=$12};
if(min[muri] + 0 == 0 || min[muri] + 0 > $12)
  {min[muri] = $12} ;
num[muri]+=1;
sum[muri]+=$12}
END{for(i in sum) printf "%d,%d,%d,%.2f,%-s\n",num[i],min[i],max[i],sum[i]/num[i],i}\'|sort -t \',\' -k 5 |tee /tmp/t_api_perf_analyze.out

MYSQL="mysql -ufemonitor  -h10.200.130.4 -pMpriv#7821@thi  --default-character-set=utf8 -A -N"

log_file="`pwd`/logs/"
service_ip=`/sbin/ip addr|grep inet|grep -v 127.0.0.1|awk -F "/" \'{print $1}\'|awk \'{print $2}\'`
service_name=`/bin/ls *.jar|head -n 1|cut -d - -f 1`

while read line;
do
   t_time=`echo $line|awk -F \',\' \'{print $5}\'`
   access_time="`echo $access_file|awk -F \'.\' \'{print $2}\'` $t_time"
   uri=`echo $line|awk -F \',\' \'{print $6}\'`
   access_num=`echo $line|awk -F \',\' \'{print $1}\'`
   max_resp=`echo $line|awk -F \',\' \'{print $3}\'`
   min_resp=`echo $line|awk -F \',\' \'{print $2}\'`
   avg_resp=`echo $line|awk -F \',\' \'{print $4}\'`

   sql="
   insert into t_api_perf_analyze (access_time,service_name,uri,access_num,max_resp,min_resp,avg_resp,service_ip,log_file) values(\'$access_time\',\'$service_name\',\'$uri\',\'$access_num\',\'$max_resp\',\'$min_resp\',\'$avg_resp\',\'$service_ip\',\'$log_file\');
 "
#   echo $sql
#   echo "################"
   $MYSQL fe_monitor -e "$sql"
done</tmp/t_api_perf_analyze.out

  

  

 

版权声明:本文为zuxing原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/zuxing/articles/10280874.html