背景
某天发现内部人员使用的app服务器访问突增,但不影响服务正常运行,想通过log统计接口的人员访问频次。
从监控平台可以看到访问激增的接口,因Nginx不缓存用户信息只有访问IP,日志清洗的Hive表只能访问前一天,不方便快速统计。
所以想直接用Linux命令检索log日志,快速输出分组排序结果。
实现方案
在知道是哪个接口被大量访问,以及访问时间段后, 可以圈定log检索范围。
log日志格式如下:
[xx-xx 16:00:00 007] 658d2xxxx-false INFO - logId=xxx uri=/api/submitOrder act=submitOrder
param={"wxUid":"123456","wxName":null,"productPoolIdList":[1234213,1111111],"uid":22222,"proposer":"张三"}
要在上述日志信息中,统计各个wxUid访问接口 /api/submitOrder 频次,并根据频次倒序排列。
Linux命令如下:
grep "uri=/api/submitOrder" $logpath | awk -F '("wxUid":|,"wxName":null)' '{print $2}'
| sort | uniq -c | sort -nr
-
grep “uri=/api/submitOrder” $logpath
框定查询范围。因log日志存放大量info信息,而我们只需要某个action的日志。logpath 为访问路径,此处可以指定访问某个时间段的log日志。 -
awk -F ‘(“wxUid”: |,“wxName”:null)’ ‘{print $2}’
字符串切割输出需要字符串。用"wxUid": 或,“wxName”:null为分隔符,将上述日志分为三部分,
1 —— [xx-xx 16:00:00 007] 658d2xxxx-false INFO - logId=xxx uri=/api/submitOrder act=submitOrder param={"wxUid":
2 —— "123456"
3 —— ,"wxName":null,"productPoolIdList":[1234213,1111111],"uid":22222,"proposer":"张三"}
取出第二部分字符串,即"123456"。 -
sort
对切割获取的结果排序。目的是将相同字符串聚集到一起。 -
uniq -c
统计数量与去重。 -
sort -nr
对统计结果倒排。不指定会按正序排。
输出结果:
其中:
1418089为该台服务器在这期间总访问次数;下面的数据,第一列为访问次数,第二列为用户wxuid,结果按访问次数倒序排。
参考文档
下面是一篇非常详细的实现博客,推荐阅读。
Linux awk+uniq+sort 统计文件中某字符串出现次数并排序