Summary of commonly used commands for analyzing nginx logs

1. Use grep, wc command to count the number of occurrences of a request or string

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

cat /usr/local/nginx/logs/access.log | grep 'GET /app/kevinContent' | wc -l

其中 cat 用来读取日志内容, grep 进行匹配的文本搜索, wc 则进行最终的统计。
当然只用 grep 也能实现上述功能:
grep 'GET /app/kevinContent'  /usr/local/nginx/logs/access.log -c
 
Count the number of calls of all interfaces and display the top 20 URLs with the most occurrences
 cat /usr/local/nginx/logs/access.log|awk '{split($7,b,"?");COUNT[b[1]]++;}END{for(a in COUNT) print  COUNT[a], a}'|  sort -k1 -nr| head -n20 
2722 /
10 /group1/M00/00/00/wKgKylqT3OCAUrqYAAAwK2jUNaY262 .png
9 /group1/M00/00/00/wKgKylqUxBOAFo8hAAKHUIZ3K9s443 .jpg
6 /group1/M00/00/00/wKgKylqUrceAGkPOAAAwK2jUNaY843 .png
4 /group1/M00/00/00/wKgKylqTsFCAdeEuAAKHUIZ3K9s287 .png
3 /group2/M00/00/00/wKgKy1qUtu2Acai1AAKHUIZ3K9s555 .jpg
2 /favicon .ico
1 /group2/M00/00/00/wKgKy1qT3P-Ae-vQAAKHUIZ3K9s459 .png
1 /group2/M00/00/00/wKgKy1qT3P-Ae-vQAAKHUIZ3K9s459 .jpg
1 /group1/M00/00/00/wKgKylqUyMuAdkLwAAAwK2jUNaY176 .png
 
解释说明:
这里 awk 是按照空格把每一行日志拆分成若干项,其中$7对应的就是URL,当然具体对应的内容和使用nginx时设置的日志格式有关。
这样就可以通过拆分提取出IP,URL,状态码等信息。 split awk 的内置函数,在此的意思是按照“?”将URL进行分割得到一个数组,并赋值给b。
COUNT[b[1]]++表示相同的接口数目加1。 sort 用来排序,-k1nr表示要把进行排序的第一列作为数字看待,并且结果倒序排列。
head -n20意为取排名前二十的结果。
3. The interface for statistical error reporting 
统计nginx日志中报错较多的接口,对于分析服务器的运行情况很有帮助,也可以有针对性的修复bug和性能优化。
[root@Fastdfs_storage_s1 ~] # cat /usr/local/nginx/logs/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. Count HTTP response status codes
通过统计响应状态码可以看出服务器的响应情况,比如499较多时可以判断出服务器响应缓慢,再结合3可以找出响应慢的接口,
这样就能有针对性进行性能分析和优化。
 
[root@Fastdfs_storage_s1 ~] # cat /usr/local/nginx/logs/access.log |awk '{counts[$(9)]+=1}; END {for(code in counts) print code, counts[code]}'
| sort -k 2 -nr
 
200 2733
304 20
404 11
5. Statistical server concurrency
cat /usr/local/nginx/logs/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 multiple conditional and or operation
有时候我们需要在nginx日志通过多个条件来查找某些特定请求,比如我需要找个某个用户浏览文章的请求,则可以需要同时匹配两个条件:
浏览文章接口GET /app/kevinContent 和userId=59h7hrrn。
 
grep 对应的与操作命令如下:
[root@Fastdfs_storage_s1 ~] # grep -E "GET /app/kevinContent.*userId=59h7hrrn" /usr/local/nginx/logs/access.log
 
grep 与命令格式: grep -E “a.*b” file ,ab条件同时成立
grep 或命令的格式为: grep -E “a|b” file ,ab两个条件有一个成立即可。
7. grep print the matching lines before and after 
有时候我们需要查找某个特定请求的前后几行的请求,以观察用户的关联操作情况。 grep 提供了一下几条命令:
# grep -C 5 'parttern' inputfile    //打印匹配行的前后5行。
# grep -A 5 'parttern' inputfile    //打印匹配行的后5行
# grep -B 5 'parttern' inputfile    //打印匹配行的前5行
 
grep -An  或 grep -A n
grep -Bn  或 grep -B n
grep -Cn  或 grep -C n
 
如下,打印出access.log日志文件中匹配 /app/kevinContent 关键字符所在行的前后各10行
[root@Fastdfs_storage_s1 ~] # grep -C 10 'GET /app/kevinContent' /usr/local/nginx/logs/access.log
 
 
 
 
 
 
 
 
 
 
 
 

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=324995530&siteId=291194637