有时候需要帮运营去统计一些数据,不论是活动产生的数据还是日常的数据。因为并没有功能来支撑,所以只能从日志中进行统计。
今天是需要通过在日志中按月统计用户登录的次数:
我们的日志格式大概如下:
[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月份的用户的登录次数,我们需要借助awk和grep命令来实现:
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就是其中一个。如果有额外的场景使用,也希望我们多多进行探索。