linux如何按月统计日志中的接口访问数量

背景

有时候需要帮运营去统计一些数据,不论是活动产生的数据还是日常的数据。因为并没有功能来支撑,所以只能从日志中进行统计。
今天是需要通过在日志中按月统计用户登录次数
我们的日志格式大概如下:

[2023-04-21 17:45:22.500] [1681985022047] [INFO] [http-nio-8066-exec-10] [http] [6f69159e6c8f4cb3828c691f2e6c6020] [3] [preserve1] [com.a.b
.c.LogFilter] Response ((POST)) ((/api/user/login)) 123.118.108.22---((200))  userId (( user_id_0))(({"code":500,"data":null,"msg":"ac
countPasswordError","identifier":""}))

解决过程

首先找到我们服务中所有用于登录的接口,假设接口为/api/user/login:
假设我们想统计3月份的用户的登录次数,我们需要借助awkgrep命令来实现:

grep '/api/web/webUser/login' server1.log | awk '{
  # 提取日期信息
  date_str = substr($0, index($0, "[") + 1, 10)
  
  # 解析日期
  split(date_str, date_arr, "-")
  month = date_arr[2]

  # 如果月份为3,增加计数
  if (month == "03") {
    requests_count++
  }
}
END {
  # 打印结果
  print "March 2023: " requests_count " requests"
}'

输出:

March 2023: 1586 requests

如果我们的登录接口不止一个,那么需要将我们的登录接口的条件都加上,如果是或者的关系,我们需要用到grep -E '/api/user/login|/api/user/login1'

grep -E '/api/user/login|api/user/login1' server1.log | grep 'POST'  | awk '{
  # 提取日期信息
  date_str = substr($0, index($0, "[") + 1, 10)
  
  # 解析日期
  split(date_str, date_arr, "-")
  month = date_arr[2]

  # 如果月份为3,增加计数
  if (month == "03") {
    requests_count++
  }
}
END {
  # 打印结果
  print "March 2023: " requests_count " requests"
}'

当然,我上边的条件除了用到OR的关系,也用到了且(AND)的关系,所以且的关系需要使用多个 grep 命令,将它们通过管道 | 连接在一起。

总结

linux中提供了很多强大的命令供我们进行统计使用,awk就是其中一个。如果有额外的场景使用,也希望我们多多进行探索。

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值