测试开发日志——Linux shell(1)Nginx日志分析
推荐的学习资料
- 高级Bash脚本编程指南
- LINUX与UNIX SHELL编程指南
- 鸟哥的Linux私房菜
- IBM DeveloperWorks
- 阮一峰的《bash脚本教程》
代码格式化
- 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 }

浙公网安备 33010602011771号