0
点赞
收藏
分享

微信扫一扫

(14.1)Nginx日志分析项目实战


文章目录

  • ​​1.ngingx的日志格式​​
  • ​​2.基于nginx日志的特点,分析nginx日志​​

1.ngingx的日志格式

  • nginx的日志格式:vim /etc/nginx/nginx.conf

log_format main '$remote_addr - $remote_user [stime_local] $request' 
'"$status" $body_bytes_sent "$http_referer"'
'"$http_user_agent" "$http_x_forwarded_for"'

上面的变量都是nginx的内部变量
$remote_addr:远程IP;
$remote_user:远程用户;没有获得,则是-
$stime_local:时间;
$request:用来记录请求的url与http协议;post提交,delete删除,get请求,/是网站根目录
$status:用来记录请求状态;成功是200;
$body_bytes_sent:记录发送给客户端文件主体内容大小,请求的大小
$http_referer:用来记录从那个页面链接访问过来的;
$http_user_agent:记录客户浏览器的相关信息;Mozilla是火狐访问的方式
$http_x_forwarded_for:访问用户的真实 IP 地址;

  • 参考:​​Nginx 日志格式​​

(14.1)Nginx日志分析项目实战_IP

2.基于nginx日志的特点,分析nginx日志

  • ngingx的特点

$remote_addr $1
$time_local $4
$request $7
$status $9
$body_bytes_sent $10

  • (1)统计2017年9月5日的PV量
    PV量:Page View页面点击量
    注意awk是字符串比较,动作{print $0}是否需要无所谓,默认就自带

grep '05/Sep/2017' log|wc -l
awk '$4>="[05/Sep/2017:08:00:00" && $4<="[05/Sep/2017:09:00:00" {print $0}' log|wc -l

  • (2)统计2017年9月5日,一天内访问最多的10个IP(ip top10)
    数组:想统计啥,就把啥作为索引
    -k2按照第2列排序,逆序排列

grep '05/Sep/2017' log|awk '{ips[$1]++} END{for(i in ips){print $i, ips[i]}}'|sort -k2 -rn |had -n 10

直接使用awk,但是awk需要转义
awk '/05\/Sep\/2017/{ips[$1]++} END{for(i in ips){print $i, ips[i]}}'|sort -k2rn |had -n 10

  • (3)统计2017年9月5日 访问大于100次的IP

grep '05/Sep/2017' log|awk '{ips[$i]++} END{for(i in ips){if(ips[i] > 100){print i, ips[i]}}}'

awk '/05\/Sep\/2017/{ips[$i]++} END{for(i in ips){{print i, ips[i]}}}' log|awk '$2>100'

(14.1)Nginx日志分析项目实战_nginx_02

  • (4)统计2017年9月5日,访问最多的10个页面{$request top 10}

grep '05/Sep/2017' log|awk '{urls[$7]++} END{for(i in urls){print urls[i], i}}'|sork -k1 -rn |head -n10

awk '/05\/Sep\/2017/{urls[$7]++} END{for(i in urls){print i, urls[i]}}'|sork -k2 -rn |head -n10

(14.1)Nginx日志分析项目实战_状态码_03

  • (5)统计2017年9月5日,每个URL访问内容的总大小

grep '05/Sep/2017' log|awk '{urls[$7]++; size[$7]+=$10} END{for(i in urls){print urls[i], size[i], i}}'|sork -k1 -rn |head -n10

awk '/05\/Sep\/2017/{size[$7]+=10} END{for(i in size){print i, size[i]}}'|sork -k2 -rn |head -n10

(14.1)Nginx日志分析项目实战_IP_04

  • (6)统计2017年9月5日,每个IP访问状态码的数量($status)
    用啥,就把啥作为累加
    同一个IP,同一个状态码做索引,做++

先按照ip排序,相同ip在一起去
404是文件没有找到的意思
grep '05/Sep/2017' log|awk '{ip_code[$1" "$9]++} END{for(i in ip_code){print i, ip_code[i]}}'|sork -k1 -rn |head -n10

awk '/05\/Sep\/2017/{ip_code[$1" "$9]++} END{for(i in urls){print i, ip_code[i]}}'|sork -k1 -rn |head -n10

(14.1)Nginx日志分析项目实战_nginx_05

  • (7)统计2017年9月5日,每个IP访问状态码为404的数量及出现的次数($status)

grep '05/Sep/2017' log|awk '{if($9=="404"){ip_code[$1" "$9]++}} END{for(i in ip_code){print i, ip_code[i]}}' log|sort -k3rn|head

awk '/05\/Se\/2017/{if($9=="404"){ip_code[$1" "$9]++}} END{for(i in ip_code){print i, ip_code[i]}}' log|sort -k3rn|head

(14.1)Nginx日志分析项目实战_IP_06

  • (8)统计前1分钟的PV量

date=$(date -d '-1 minute' +%d/%b/%Y:%H%M);awk -v date=$date '$0 ~ date {i++} END{print i}' log

awk -v a=$date '$0 ~ a' log

date -d ‘-1 minute’
前1分钟
awk -v a=$date
的-v表示外部变量的使用,将前面的$date变量的值赋给a


举报

相关推荐

0 条评论