nginx日志分析命令

admin 2020-03-21 PM 5℃ 0条

在分析服务器运行情况和业务数据时,nginx日志是非常可靠的数据来源,而掌握常用的nginx日志分析命令的应用技巧则有着事半功倍的作用,可以快速进行定位和统计。

下面是在分析nginx日志时常用命令的一些总结。

1.利用grep ,wc命令统计某个请求或字符串出现的次数

比如我要统计GET /task/showContent接口在某天的调用次数,则可以使用如下命令:

cat nginx-ad-access.log | grep 'GET /task/showContent' | wc -l,


其中cat用来读取日志内容,grep进行匹配的文本搜索,wc则进行最终的统计。
当然只用grep也能实现上述功能:

 grep 'GET /task/showContent'  nginx-ad-access.log -c

2.统计所有接口的调用次数并显示出现次数最多的前二十的URL

cat nginx-ad-access.log|awk '{split($7,b,"?");COUNT[b[1]]++;}END{for(a in COUNT) print  COUNT[a], a}'|sort -k1 -nr|head -n20 

这里awk是按照空格把每一行日志拆分成若干项,其中$7对应的就是URL,当然具体对应的内容和使用nginx时设置的日志格式有关。这样就可以 通过拆分提取出IP,URL,状态码等信息。split是awk的内置函数,在此的意思是按照“?”将URL进行分割得到一个数组,并赋值给b。 COUNT[b[1]]++表示相同的接口数目加1。sort用来排序,-k1nr表示要把进行排序的第一列作为数字看待,并且结果倒序排列。head -n20意为取排名前二十的结果。

3. 统计报错的接口

统计nginx日志中报错较多的接口,对于分析服务器的运行情况很有帮助,也可以有针对性的修复bug和性能优化。

cat nginx-ad-access.log|awk'{if($9==500) print $0}'|awk '{split($7,b,"?");COUNT[b[1]]++;}END{for(a in COUNT) print  COUNT[a], a}'|sort -k 1 -nr|head -n10

先用awk’{if(9==500)print0}’过滤出500错误的日志,然后在此基础上做统计,其思路同2

4. 统计HTTP响应状态码

通过统计响应状态码可以看出服务器的响应情况,比如499较多时可以判断出服务器响应缓慢,再结合3可以找出响应慢的接口,这样就能有针对性进行性能分析和优化

 cat nginx-ad-access.log |awk '{counts[$(9)]+=1}; END {for(code in counts) print code, counts[code]}' | sort -k 2 -nr

5.统计服务器并发量

cat nginx-ad-access.log |grep '10.15.19.138'| awk '{COUNT[$4]++}END{for( a in COUNT) print a,COUNT[a]}'|sort -k 2 -nr|head -n20

nginx转发请求时可以记录响应请求的服务器IP,先通过grep过滤出某个服务器所有的请求,然后统计各个时间点的并发请求响应的数量即可得到某个服务器的并发量。$4对应的是响应时间。当然,如果把grep的内容更换成某个接口也就可以统计出该接口对应的并发量了。

6.grep多条件与或操作

有时候我们需要在nginx日志通过多个条件来查找某些特定请求,比如我需要找个某个用户浏览文章的请求,则可以需要同时匹配两个条件:浏览文章接口GET /task/showContent和userId=59h7hrrn,grep对应的与操作命令如下:

grep -E "GET /task/showContent.*userId=59h7hrrn" nginx-ad-access.log

grep与命令格式: grep -E “a.*b” file,ab条件同时成立
而grep或命令的格式为:grep -E “a|b” file ,ab两个条件有一个成立即可。

7.grep打印匹配的前后几行

有时候我们需要查找某个特定请求的前后几行的请求,以观察用户的关联操作情况。

grep提供了一下几条命令:
 

grep -C 5 ‘parttern’ inputfile //打印匹配行的前后5行

grep -A 5 ‘parttern’ inputfile //打印匹配行的后5行

grep -B 5 ‘parttern’ inputfile //打印匹配行的前5行

比如

grep -C 10 ‘GET /task/showContent/1agak?userId=59h7hrrn’ nginx-ad-access.log

就可以打印出该请求的前后10条请求 .

标签: none

非特殊说明,本博所有文章均为博主原创。

评论啦~