awk从nginx日志统计当天的qps

Nginx日志格式

nginx配置的日志格式(包含了请求ip、请求时间、请求的地址、负载转发的目标地址、请求方法、响应时间、响应状态等等)


        log_format main =json '{ "remote_addr": "$remote_addr", '
                                '"remote_user": "$remote_user", '
                                '"@timestamp": "$time_local", '
                                '"request": "$request", '
                                '"uri": "$uri", '
                                '"args": "$args", '
                                '"request_body": "$request_body", '
                                '"status": $status, '
                                '"body_bytes_sent": $body_bytes_sent, '
                                '"bytes_sent": $bytes_sent, '
                                '"gzip_ratio": "$gzip_ratio", '
                                '"referer": "$http_referer", '
                                '"user_agent": "$http_user_agent", '
                                '"x_forwarded": "$http_x_forwarded_for", '
                                '"upstream_addr": "$upstream_addr",'
                                '"upstream_response_time": "$upstream_response_time",'
                                '"upstream_status": "$upstream_status",'
                                '"request_time": "$request_time"'
                                ' }';

实际产生的日志(这里贴了一条。还有一个测试文件从系统中截取了一部分,大约200条的样子。地址:https://download.csdn.net/download/qq_27062249/20314622【全部放这里显示太乱、太长了,下载不需要积分】,如果下载不了又想动手自己操作小的小伙伴留言给我,我发给你)

{ "remote_addr": "172.16.18.119", "remote_user": "", "@timestamp": "15/Jul/2021:22:43:21 +0800", "request": "GET /user/selectById?userId=5149471 HTTP/1.1", "uri": "/user/selectById", "args": "userId=5149471", "request_body": "", "status": 200, "body_bytes_sent": 883, "bytes_sent": 1146, "gzip_ratio": "", "referer": "", "user_agent": "Java/1.8.0_191", "x_forwarded": "", "upstream_addr": "172.16.18.118:14004","upstream_response_time": "0.002","upstream_status": "200","request_time": "0.002" }

awk操作nginx日志

截取单条日志的请求时间和请求rul

awk 'FS=" " {print NR,"\t", $7,"\t",$11}' test.log

解释下上面这个命令吧:FS是定义awk按照什么标识符将当前的每一条日志进行切割,这里定义的是空格(系统默认的也是空格),print后面接的是需要打印的东西,NR表示当前是第几行,$7和$11取的是FS定义的分隔符切割后的值(就想成一条日志被FS定义的切割符切割之后转换成了一个数组,从数组里面取,但是下标是从1开始),\t 表示一个制表符,test.log就是目标文件

最后打印的结果,如下图(我们把单挑日志的请求时间和请求rul打印出来了):

按照请求时间进行分组并统计请求次数

awk 'FS=" " { a[$7]+=1}END{for(i in a) print i,a[i]}' test.log  > temp.log

解释下上面这个命令吧:使用空格对每一条日志进行切割,以第7列进行统计,test.log就是目标文件,转储到temp.log文件中

最后打印的结果,如下图:

我们能看到22点43分21秒的请求次数为46次,22秒为94次,23秒为53次

temp.log文件内容:

"15/Jul/2021:22:43:21 46
"15/Jul/2021:22:43:22 94
"15/Jul/2021:22:43:23 53

查找出单位时间内(秒)请求次数最多的次数

awk ' BEGIN{max=0}{if(max<$2){max=$2}}END{print max}' temp.log

解释下上面这个命令吧:按照空格将temp.log中文件分割,取 "数组"下标为2的数据进行比较,打印出最大的值

两个操作步骤麻烦的话,两个步骤合成一个步骤(用一个管道符,将第一次的输出作为第二次的输入):

awk 'FS=" " { a[$7]+=1}END{for(i in a) print i,a[i]}' test.log | awk ' BEGIN{max=0}{if(max<$2){max=$2}}END{print max}'

能看到每秒请求数量最大的量为94也输出了

猜你喜欢

转载自blog.csdn.net/qq_27062249/article/details/118770956