测试开发日志——Linux shell(1)Nginx日志分析

推荐的学习资料

  • 高级Bash脚本编程指南
  • LINUX与UNIX SHELL编程指南
  • 鸟哥的Linux私房菜
  • IBM DeveloperWorks
  • 阮一峰的《bash脚本教程》
  • Google   

代码格式化

  • vs code
  • shell format插件
 1 url_summary() {
 2     #管道符后面可以换行
 3     less nginx.log |
 4         awk '{print $7}' |
 5         #sed的多个表达式合并
 6         sed -e 's/\?.*//g' \
 7             -e 's/\/avatar\/[0-9]*/\/avatar\/int/g' \
 8             -e 's/\/topics\/[0-9]*/\/topics\/int/g' \
 9             -e 's/\/replies\/[0-9]*/\/replies\/int/g' |
10         sed -e 's/\/[0-9a-z\-]*\.png/\/id.png/g' |
11         sed -e 's/\/[0-9a-z\-]*\.jpg/\/id.jpg/g' |
12         sed -e 's/\/[0-9a-z\-]*\.jpeg/\/id.jpeg/g' |
13         sed -e 's/\/[0-9a-z\-]*\.gif/\/id.gif/g' |
14         sort | uniq -c | sort -nr
15 }

演练数据

nginx.log

实战内容

  • 日志数据检索
    • 找出log中的404 500的报错 考察严谨性
    • 找出500错误时候的上下文 考察grep高级用法
  • 日志数据统计
    • 找出访问量最高的ip 统计分析
  • 数据文件修改
    • 找出访问量最高的页面地址 借助于sed的统计分析

find_error_log

编写一个函数 find_error_log()
找出log中的404 500的报错 考察严谨性,某次训练没有一人做对

回复的时候按照这个格式

1 find_error_log() {
2     less nginx.log | awk '$9~/500|404/{print $0}'
3 }

 

find_before

找出500错误时候的上下文,找出500错误的前两行 考察grep高级用法

1 find_before(){
2     grep -B 2 -E '\s500\s ' nginx.log
3 }

 

find_top_10

找出访问量最高的ip, 统计分析,取出top10

1 find_top_10(){
2    less nginx.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -n 10
3 }

 

url_summary

找出访问量最高的页面地址 借助于sed的统计分析

  • /topics/16689/replies/124751/edit 把数字替换为 /topics/int/replies/int/edit
  • /_img/uploads/photo/2018/c54755ee-6bfd-489a-8a39-81a1d7551cbd.png!large 变成 /_img/uploads/photo/2018/id.png!large
  • /topics/9497 改成 /topics/int
  • 其他规则参考如上

输出

  • url pattern对应的请求数量
  • 取出top 20请求量的url pattern

1. 去除?后的字符
2. 地址中的%21替换为!
3. /topics/或/replies/或/avatar/后的数字替换为int
4. 图片前的字符替换为id
5. topics|following|replies|columns|favorites|reward|followers结尾的,把前面的用户名替换为username
6. tar.tgz|tar.gz|tar|gz|zip|rar结尾的替换为compress
*7. /用户名的不知道怎么跟cable和topics等做区分,故没有做合并*

 1 url_summary(){
 2   awk '{print $7}' nginx.log | \
 3   sed 's#\?.*##g' | \
 4   sed 's#%21#\!#g' | \
 5   sed -r 's#/(topics|replies|avatar)/[0-9]+#/\1/int#g' | \
 6   sed -r 's#(.+)/[^/].*(png|jpg|gif|jpeg.*)#\1/id\.\2#g' | \
 7   sed -r 's#^/[^/]+/(topics|following|replies|columns|favorites|reward|followers)$#/username/\1#g' | \
 8   sed -r 's#\.(tar\.tgz|tar\.gz|tar|gz|zip|rar)$#\.compress#g' | \
 9   sort | uniq -c | sort -nr | head -20
10 }

 

 url_avg_time

找出相同url的平均响应时间

1. 根据上面的方法合并处理访问地址 2. 按访问地址排序,相同的访问地址排在一起 3. 根据相同的地址汇总总响应时间以及该地址的访问数量 4. 计算每个访问地址的平均响应时间,并按平均响应时间排序
 1 url_avg_time(){
 2   awk '{print $(NF-1), $7}' nginx.log | \
 3   sed 's#\?.*##g' | \
 4   sed 's#%21#\!#g' | \
 5   sed -r 's#/(topics|replies|avatar)/[0-9]+#/\1/int#g' | \
 6   sed -r 's#(.+)/[^/].*(png|jpg|gif|jpeg.*)#\1/id\.\2#g' | \
 7   sed -r 's# /[^/]+/(topics|following|replies|columns|favorites|reward|followers)$# /username/\1#g' | \
 8   sed -r 's#\.(tar\.tgz|tar\.gz|tar|gz|zip|rar)$#\.compress#g' | \
 9   sort -k 2 | \
10   awk '{total[$2]+=$1; times[$2]++;} END{for(url in total){avg=sprintf("%.3f", total[url]/times[url]); print(avg, url)}}' | \
11   sort -k 1 -nr | \
12   awk 'BEGIN{printf("%s\t%s\n", "平均响应时间", "接口地址")} {printf("%8s\t%s\n", $1, $2)}'
13 }

 

posted @ 2020-05-24 13:57  Cyrus-1900  阅读(285)  评论(0)    收藏  举报