awk神器呀

概述


在之前写过一篇一条慢SQL导致购物车服务无法使用的文章,由于购物车是入口,出了故障,自然都不是小问题。这不,老板说要统计一下影响面。如果没有成熟的业务监控和统计工具,干这种活,只能用最原始的查日志的方式。

本来我想把日志下载下来,写段JAVA代码分析一下,谁知日志文件居然有3个g,除了下载慢,用JAVA分析起来也慢。果断放弃,换用江湖人称日志内容查找神器的awk大哥出来帮忙。


找出添加购物车失败的有效次数


一般来说,业务操作失败后,是要记录请求的入参的,以便帮助定位问题,添加购物车失败的请求入参大概如下:

[qtp691540605-1332] ERROR ShopCartController 添加商品到购物车失败,userId:5555555,request:{"buyNum":1,"skuId":777777}
[qtp691540605-1332] ERROR ShopCartController 添加商品到购物车失败,userId:5555555,request:{"buyNum":1,"skuId":777777}
[qtp691540605-1332] ERROR ShopCartController 添加商品到购物车失败,userId:5555555,request:{"buyNum":1,"skuId":666666}
[qtp691540605-1332] ERROR ShopCartController 添加商品到购物车失败,userId:5555555,request:{"buyNum":1,"skuId":666666}
[qtp691540605-1332] ERROR ShopCartController 添加商品到购物车失败,userId:8888888,request:{"buyNum":1,"skuId":666666}

有些朋友可能会说,直接用

cat cart.log | grep 添加商品到购物车失败 | wc -l

不就搞定了吗?这样做,统计出来的失败次数会多很多的,因为很多用户发现添加商品到购物车失败后,会不断重试的,请求参数都是一样的,属于重复次数了。因此我们得针对用户id进行去重。因此我们首先可以先以userId作为分割点,将日志行切分成两截,并打印出第二截。

cat cart.log | grep 添加商品到购物车失败 |awk -F 'userId' '{print $2}'

执行完后,输出的内容如下:

:5555555,request:{"buyNum":1,"skuId":777777}
:5555555,request:{"buyNum":1,"skuId":777777}
:5555555,request:{"buyNum":1,"skuId":666666}
:5555555,request:{"buyNum":1,"skuId":666666}
:8888888,request:{"buyNum":1,"skuId":666666}

接下来再按照userId,例如上面的5555555后面的逗号作为分隔点,再次将日志内容切分成两截,并取用第一截的内容。

cat cart.log | grep 添加商品到购物车失败 |awk -F 'userId' '{print $2}' | awk  -F ',' '{print $1}'

执行完后,输出结果如下:

:5555555
:5555555
:5555555
:5555555
:8888888

这个时候,我们就可以针对userId排序去重了。

cat cart.log | grep 添加商品到购物车失败 |awk -F 'userId' '{print $2}' | awk  -F ',' '{print $1}' |sort| uniq -c |

输出结果如下:

:5555555
:8888888

这种统计方式其实也是有问题的。因为同一个userId,他可以买不同的商品的,例如上面的

[qtp691540605-1332] ERROR ShopCartController 添加商品到购物车失败,userId:5555555,request:{"buyNum":1,"skuId":777777}
[qtp691540605-1332] ERROR ShopCartController 添加商品到购物车失败,userId:5555555,request:{"buyNum":1,"skuId":666666}

因此只是按照userId来统计的话,会少了一部分数据。为了得到真正有效的次数,我们应该以添加商品到购物车失败,这段文字作为分割点,然后用第二截。

cat cart.log | grep 添加商品到购物车失败 |awk -F '添加商品到购物车失败,' '{print $2}'

执行后结果如下:

userId:5555555,request:{"buyNum":1,"skuId":777777}
userId:5555555,request:{"buyNum":1,"skuId":777777}
userId:5555555,request:{"buyNum":1,"skuId":666666}
userId:5555555,request:{"buyNum":1,"skuId":666666}
userId:8888888,request:{"buyNum":1,"skuId":666666}

以上面的行进行排序去重统计次数,完整命令如下:

cat cart.log | grep 添加商品到购物车失败 |awk -F '添加商品到购物车失败,' '{print $2}' | sort | uniq -c | wc -l

这样我们就统计出添加购物车失败的有效次数了,然后我们用这个数去除以添加购物车的总次数,就得到一个占比了。

有效的添加购物车失败次数/添加购物车的总次数

如果占比非常小的话,说明影响不严重。当然我们也可以用类似的命令去统计一下,当时的购物车故障,影响了多少人购买了。这个很简单,跟上面的命令差不多,留给读者自己思考哈。

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值