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

发布时间:2024年01月15日

背景

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

[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就是其中一个。如果有额外的场景使用,也希望我们多多进行探索。

文章来源:https://blog.csdn.net/iamlihongwei/article/details/135605632
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。