三剑客实战Nginx日志分析

课程价值

  • 掌握shell的管道机制
  • 掌握三剑客的实用用法

大纲

  • 实战环境
  • nginx 日志解析

时长

90分钟

学习资料

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

awk官方文档, mac下的awk与gawk并不一致,用法上有一定的差异。

定义函数

# 查看命令
type 

awk字段枚举

awk 'NR==1{for(i=1;i<=NF;i++) {print i"="$i} }' nginx.log

课间作业

演练数据

把/tmp/nginx.log文件复制到自己的家目录下,用来演练

实战内容

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

find_error_log

编写一个函数 find_error_log()
找出log中的404 500的报错
回复的时候按照这个格式

find_error_log() {
}
url_summary(){

}

find_before

找出500错误时候的上下文,找出500错误的前两行 考察grep高级用法,并把这个参数的描述信息贴上

find_before(){
}

find_top_3

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

find_top_3(){

}

url_avg_time

找出 /topics 的平均响应时间,响应时间在倒数第二个字段

url_avg_time(){
#易读性好,易修改
awk '$7=="/topics"' nginx.log | awk '{print $(NF-1)}' | awk '{t+=$1}END{print t/NR }'
#高性能
awk '$7=="/topics"{total+=$(NF-1);count+=1}END{print total/count}'  nginx.log

课后作业 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
类似
nnn urlxxx
mmm urlxxx

url_summary(){

}

PPT

https://pdf.ceshiren.com/lg5/2020.12.08-三剑客实战Nginx日志分析

这是明天的直播课内容了吧?

url_summary() { awk '{print $7}' nginx.log | sed -E 's@/[0-9]+@/int@g;s/[a-zA-Z0-9-]+.jpg/id.jpg/g;s/[a-zA-Z0-9-]+.png/id.png/g;s/[a-zA-Z0-9-]+.gif/id.gif/g' | sort | uniq -c | sort -nr | head -20; }

微信截图_20201209135226

2 个赞

这正则看的我眼花缭乱

url_summary(){
     awk '{print $7}' nginx.log | sed -e 's/[0-9a-f]\{8\}\(-[0-9a-f]\{4\}\)\{3\}-[0-9a-f]\{12\}/id/g' -e 's/\/[0-9a-z]\{32\}/\/id/g' -e 's/\b\/[0-9]\{3,\}\b/\/int/g' | sort | uniq -c | sort -nr | head -20
}

image

2 个赞
url_summary(){

awk '{print $7}' nginx.log | sed 's/[0-9a-z]\{8\}\-[0-9a-z]\{4\}\-[0-9a-z]\{4\}\-[0-9a-z]\{4\}\-[0-9a-z]\{12\}.png/id.png/g;s/[0-9a-z]\{8\}\-[0-9a-z]\{4\}\-[0-9a-z]\{4\}\-[0-9a-z]\{4\}\-[0-9a-z]\{12\}.jpg/id.jpg/g;s/[0-9a-z]\{8\}\-[0-9a-z]\{4\}\-[0-9a-z]\{4\}\-[0-9a-z]\{4\}\-[0-9a-z]\{12\}.gif/id.gif/g;s/\/[0-9]\{1,\}/\/int/g' | sort | uniq -c | sort -nr | head -20

}

url_summary(){
cat nginx.log | awk '{print $7}' | sed 's#/topics/[0-9]\+#/topics/int#g;s#/topics/int/replies/[0-9]\+#/topics/int/replies/int#g;s#/uploads/photo/2018/[0-9a-z\-]*#/uploads/photo/2018/id#g' | sort | uniq -c | sort -nr|head -20

}

image

url_summary()
{
        echo "url_summary"
        awk '{print $7 }' nginx.log | sed 's/topics\/[0-9]\+/topics\/int/g;s/replies\/[0-9]\+/replies\/int/g;s/\(-\|[0-9]\|[a-z]\)\+\.png/id.png/' | sort | uniq -c | sort -nr | head -20
}

awk '{print $7}' nginx.log | sed 's@\/topics\/[0-9]*@\/topics\\int@g ; s@replies\/[0-9]*@replies\/int@g ; s@photo\/\([0-9]\{4\}\)\/.*\.\([a-z]\{3\}\)@photo/\1/id.\2@g' | sort | uniq -c | sort -rn | head -20

awk '{print$7}' nginx.log | sed -e 's@/topics/[0-9]*@/topics/int@g;s@/replies/[0-9]*@/replies/int@g;s@/avatar/[0-9]*@/avatar/int@g;s@/[a-zA-Z0-9-]*.jpg@/id.jpg@g;s@/[a-zA-Z0-9-]*.png@/id.png@g'| sort | uniq -c | sort -nr | head -20

image

awk '{print $7}' nginx.log | sed 's/[0-9a-z]\{8\}\-[0-9a-z]\{4\}\-[0-9a-z]\{4\}\-[0-9a-z]\{4\}\-[0-9a-z]\{12\}.png/id.png/g;s/[0-9a-z]\{8\}\-[0-9a-z]\{4\}\-[0-9a-z]\{4\}\-[0-9a-z]\{4\}\-[0-9a-z]\{12\}.jpg/id.jpg/g;s/[0-9a-z]\{8\}\-[0-9a-z]\{4\}\-[0-9a-z]\{4\}\-[0-9a-z]\{4\}\-[0-9a-z]\{12\}.gif/id.gif/g;s/\/[0-9]\{1,\}/\/int/g' | sort | uniq -c | sort -nr | head -20

image

awk '{print $7}' nginx.log|sed 's#/topics/[0-9]*#/topics/int#'|sed 's#/replies/[0-9]*#/repies/int#'|sed 's#/[0-9a-z-]*\.png#/id.png#' |sed 's#/[0-9a-z-]*\.jpg#/id.jpg#'|sed 's#/[0-9a-z-]*\.gif#/id.gif#' | sed 's#/[0-9a-z-]*\.jpeg#/id.jpeg#'  |sort|uniq -c |sort -rn |head -20

image

课后作业 url_summary

演练数据

把/tmp/nginx.log文件复制到自己的家目录下,用来演练

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

  • /topics/16689/replies/124751/edit
  • /_img/uploads/photo/2018/c54755ee-6bfd-489a-8a39-81a1d7551cbd.png!large

规则如下

  1. 把 9497 改成 int ,输出为 /topics/int/replies/int/edit
  2. 把 c54755ee-6bfd-489a-8a39-81a1d7551cbd.png!large 改成 id.png!large ,输出为 /_img/uploads/photo/2018/id.png!large

规则参考如上:

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

实现代码如下:

url_summary() { 
awk '{print $7}' nginx.log | sed -E 's/[0-9]+/int/g;s/[0-9a-z-]+.png/id.png/g;s/[0-9a-z-]+.jpg/id.jpg/g;s/[0-9a-z-]+.gif/id.gif/g' | sort | uniq -c | sort -nr | head -20; 
}

实现结果如下:

扩展正则元字符,可以使用 sed -E ,不用使用 \反斜杠转译。

 url_summary(){
 awk '{print $7}' nginx.log | sed -E 's#/[0-9]+([/|\?])?#/int\1#g' | sed -E 's#/(.*)/(.*)?\.([jpg|png|gif])#/\1/id.\3#' | sort | uniq -c | sort -nr | head -20 ;
}

命令:awk ‘{print $7}’ nginx.log | sed -E ‘s#[0-9]+#int#g;s@[a-zA-Z0-9_-]+.png@id.png@g;s/[a-zA-Z0-9-]+.gif/id.gif/g’|sort | uniq -c | sort -nr | head -20
截图:

url_sumary(){
 awk '{print $7}' nginx.log|sed 's@/[0-9]*/@/int/@g;s@/\w*\.png@/id.png@;s@/\w*\.jpg@/id.jpg@;s@?.*@@;s@/topics/[0-9]*$@/topics/int@'|sort |uniq -c |sort -nr|head -10
}

awk ‘{print $7}’ nginx.log | sed -e ‘s@/topics/[0-9]@/topics/int@;s@/replies/[0-9]@/replies/int@;s@[0-9a-z-].jpg@id.jpg@;s@[0-9a-z-].png@/id.png@;s@[0-9a-z-].gif@/id.gif@;s@/avatar/[0-9]/@/avatar/int/@’ | sort |uniq -c |sort -nr |head -20


image

url_summary(){ awk ‘{print $7}’ nginx.log | sed -E ‘s/[0-9]+/int/g;s/[0-9a-z-]+.png/id.png/g;s/[0-9a-z-]+.jpg/id.jpg/g;s/[0-9a-z-]+.gif/id.gif/g’ | sort | uniq -c | sort -nr | head -20; }

课间作业:
find_error_log(){ grep -E ‘(" 404 |" 500 )’ nginx.log ;}
find_before(){ grep ‘" 500 ’ -C 1 nginx.log ;}
find_top_10(){ awk ‘{print $1}’ nginx.log|sort|uniq -c|sort -nr|head -10 ;}
url_summary(){ grep ’ /topics/’ nginx.log|sed -E ‘s@/topics/[0-9]+@/topics/number@;s@/replies/[0-9]+@/replies/number@;s@?.*@@;s@/node[0-9]+@/node@’|awk ‘{print $7}’|sort|uniq -c|sort -nr|head -1 ;}

课后作业
url_summary(){ sed -E ‘s@/topics/[0-9]+@/topics/int@;s@/replies/[0-9]+@/replies/int@;s@?.*@@;s@/node[0-9]+@/node@;s@/avatar/[0-9]+/@/avatar/int/@;s@/[0-9a-zA-Z-]+.png@/id.png@;s@/[0-9a-zA-Z-]+.jpg@/id.jpg@;s@/[0-9a-zA-Z-]+.gif@/id.gif@;s@/[0-9a-zA-Z-]+.jpeg@/id.jpeg@’ nginx.log|awk ‘{print $7}’|sort|uniq -c|sort -nr|head -20 ;}
image