题目
从nginx
的日志access.log
中统计getVideoInfo
接口的QPS
。日志格式为:2019-07-12T11:16:23+0800|127.0.0.1|-|-|GET|http|127.0.0.1|/getVideoInfo?id=1
日志内容大致为:
2019-07-12T11:16:23+0800|127.0.0.1|-|-|GET|http|127.0.0.1|/getVideoInfo?id=1
2019-07-12T11:16:45+0800|127.0.0.1|-|-|GET|http|127.0.0.1|/getVideoInfo?id=1
2019-07-12T11:16:58+0800|127.0.0.1|-|-|GET|http|127.0.0.1|/getVideoInfo?id=1
2019-07-12T11:17:01+0800|127.0.0.1|-|-|GET|http|127.0.0.1|/getVideoInfo?id=1
2019-07-12T11:17:20+0800|127.0.0.1|-|-|GET|http|127.0.0.1|/getVideoInfo?id=1
解决思路
首先nginx的日志是按照时间顺序的。因此计算QPS,只需要先统计条数,再计算时间差,二者相除就可以得到。
思路一:使用wc
命令
- 第一步: 使用
wc
命令获取条数
wc -l access.log | awk '{print $1}'
- 统计第一条和最后一条的时间并格式化成时间戳
// 第一条日志时间戳
date -d "$(head -n 1 access.log | awk -F "|" '/getVideoInfo/ {print $1}')" +%s
// 最后一条日志时间戳
date -d "$(tail -n 1 access.log | awk -F "|" '/getVideoInfo/ {print $1}')" +%s
- 计算QPS完整命令
count=$(wc -l access.log | awk '{print $1}'); start=$(date -d "$(head -n 1 access.log | awk -F "|" '/getVideoInfo/ {print $1}')" +%s); end=$(date -d "$(tail -n 1 access.log | awk -F "|" '/getVideoInfo/ {print $1}')" +%s); t=$(($end-$start)); qps=$(echo "scale=2; $count/$t" | bc); printf "%.2f\n" $qps
思路二: 使用awk
命令
- 第一步,遍历统计条数
awk -F "|" '$8=="/getVideoInfo?id=1" {count++} END {print count}' access.log
- 加入统计第一条和最后一条时间计算
-v start="$(date -d "$(head -n 1 access.log | grep "getVideoInfo" | cut -d "|" -f 1)" +%s)" -v end="$(date -d "$(tail -n 1 access.log | grep "getVideoInfo" | cut -d "|" -f 1)" +%s)"
- 计算QPS完整命令
awk -F "|" -v start="$(date -d "$(head -n 1 access.log | grep "getVideoInfo" | cut -d "|" -f 1)" +%s)" -v end="$(date -d "$(tail -n 1 access.log | grep "getVideoInfo" | cut -d "|" -f 1)" +%s)" '$8=="/getVideoInfo?id=1" {count++} END {qps=count/(end-start); print qps}' access.log
评论区