侧边栏壁纸
  • 累计撰写 71 篇文章
  • 累计创建 87 个标签
  • 累计收到 5 条评论

目 录CONTENT

文章目录

使用命令统计nginx日志access.log中某个接口的QPS

KunkkaWu
2023-11-14 / 0 评论 / 4 点赞 / 11,383 阅读 / 557 字 / 正在检测是否收录...

题目

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命令

  1. 第一步: 使用wc命令获取条数
wc -l access.log | awk '{print $1}'
  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
  1. 计算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命令

  1. 第一步,遍历统计条数
awk -F "|" '$8=="/getVideoInfo?id=1" {count++} END {print count}' access.log
  1. 加入统计第一条和最后一条时间计算
-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)"
  1. 计算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
4

评论区