17项目实战_Nginx日志分析

日志格式分析

日志格式(非默认)

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

日志条目

"-" - - [06/Jan/2020:18:02:29 +0800] "GET /public/IT服务平台/ HTTP/1.1" 200 1327 "http://172.22.23.11/public/IT服务平台/15-mac必备系统工具/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36" 172.22.101.160 0

日志分析

统计PV量

# 统计2020年1月2日的PV量
[root@centos11 ~]# grep '02/Jan/2020' /usr/local/nginx/logs/access_public.log | wc -l
110

# 统计2020年1月2日00:00:00~13:00:00这段时间内的PV量
[root@centos11 ~]# awk '$4>="[02/Jan/2020:00:00:00" && $4<="[02/Jan/2020:13:00:00"{print $0}' /usr/local/nginx/logs/access_public.log | wc -l
28

统计一天内访问最多的10个IP

# 统计2020年1月2日一天内访问最多的10个IP(top10)
[root@centos11 ~]# grep '02/Jan/2020' /usr/local/nginx/logs/access_public.log | awk '{ips[$(NF-1)]++}END{for (i in ips){print i,ips[i]}}' | sort -k2 -rn | head -n10
172.22.72.30 22
172.22.50.237 16
172.22.69.128 12
172.22.225.131 8
172.22.42.173 7
172.22.85.68 6
172.22.105.26 6
172.22.70.155 5
172.22.218.231 5
172.22.108.52 5

统计一天内访问大于n次的IP

# 统计2020年1月2日访问大于10次的IP
[root@centos11 ~]# grep '02/Jan/2020' /usr/local/nginx/logs/access_public.log | awk '{ips[$(NF-1)]++}END{for (i in ips){if(ips[i]>10){print i,ips[i]}}}' | sort -k2rn
172.22.72.30 22
172.22.50.237 16
172.22.69.128 12

# 只使用awk完成
[root@centos11 ~]# awk '/02\/Jan\/2020/{ips[$(NF-1)]++}END{for (i in ips){if(ips[i]>10){print i,ips[i]}}}' /usr/local/nginx/logs/access_public.log | sort -k2rn
172.22.72.30 22
172.22.50.237 16
172.22.69.128 12

统计一天内访问最多的10个页面($request)

# 统计2020年1月2日一天内访问最多的10个页面(top10)
[root@centos11 ~]# awk '/02\/Jan\/2020/{urls[$7]++}END{for (i in urls){print urls[i],i}}' /usr/local/nginx/logs/access_public.log | sort -k1rn | head -n10
13 /public/IT服务平台/
10 /public/IT服务平台/03-办公软件/
7 /public/PPT模板/ppt模板16X9纯净版.ppt
5 /public/PPT模板/
4 /public/PPT模板/ppt模板纯净版.ppt
3 /public/IT服务平台/12-研发软件/
3 /public/IT服务平台/12-研发软件/Java/
3 /public/IT服务平台/25-客户端下载/
3 /public/IT服务平台/26-NextCloud/Ios_sui_10.1.5_1022.ipa
2 /public/IT服务平台/01-常用文档/

# 统计2020年1月1日00:00:00~2020年1月7日00:00:00这段时间内访问最多的10个页面(top10)
[root@centos11 ~]# awk '$4>="[01/Jan/2020:00:00:00" && $4<"[07/Jan/2020:00:00:00"{urls[$7]++}END{for (i in urls){print urls[i],i}}' /usr/local/nginx/logs/access_public.log | sort -k1rn | head -n10
599 /public/IT服务平台/09-系统镜像/OS%20X%2010.11.1%2815B42%29.cdr
274 /public/IT服务平台/
91 /public/IT服务平台/03-办公软件/
73 /public/IT服务平台/05-Polycom视频会议软件/RPDmac-release_3.2.1_48485.dmg
46 /public/IT服务平台/12-研发软件/
44 /public/IT服务平台/06-K3软件/K3CloudClientPortal.exe
38 /public/IT服务平台/12-研发软件/Java/
36 /public/IT服务平台/05-Polycom视频会议软件/Polycom%20RealPresence%20Desktop330.zip
31 /public/IT服务平台/25-客户端下载/
30 /public/IT服务平台/01-常用文档/

统计每个URL访问内容总大小($body_bytes_sent)

# 统计2020年1月2日一天内访问页面总大小最多的10个页面
# 显示效果:页面总大小 url
[root@centos11 ~]# awk '/02\/Jan\/2020/{size[$7]+=$10}END{for(i in size){print size[i],i}}' /usr/local/nginx/logs/access_public.log | sort -k1rn | head -n10
714913792 /public/IT服务平台/03-办公软件/01-Office系列软件/Visio%202016/SW_DVD5_Visio_Pro_2016_64Bit_ChnSimp_MLF_X20-42759.ISO
609447936 /public/IT服务平台/03-办公软件/01-Office系列软件/Visio%202016/SW_DVD5_Visio_Pro_2016_W32_ChnSimp_MLF_X20-41580.ISO
299891682 /public/IT服务平台/26-NextCloud/Ios_sui_10.1.5_1022.ipa
165674520 /public/IT服务平台/03-办公软件/03-Xmind/xmind-8-update8-windows.exe
138681500 /public/IT服务平台/26-NextCloud/Andriod_sui_10.1.5_1032.apk
121225744 /public/IT服务平台/06-K3软件/K3CloudClientPortal.exe
75260160 /public/IT服务平台/03-办公软件/06-金蝶云/suiSetup_1.1.2_1022-win.exe
70087283 /public/IT服务平台/06-K3软件/k3打印插件/K3Cloud打印插件.rar
26376260 /public/PPT模板/ppt模板16X9纯净版.ppt
8286208 /public/PPT模板/ppt模板4X3纯净版.ppt

# 统计2020年1月2日一天内访问次数最多的10个页面
# 显示效果:访问次数 页面总大小 url
[root@centos11 ~]# awk '/02\/Jan\/2020/{urls[$7]++;size[$7]+=$10}END{for(i in size){print urls[i],size[i],i}}' /usr/local/nginx/logs/access_public.log | sort -k1rn | head -n10
13 17223 /public/IT服务平台/
10 5900 /public/IT服务平台/03-办公软件/
7 26376260 /public/PPT模板/ppt模板16X9纯净版.ppt
5 1430 /public/PPT模板/
4 1853440 /public/PPT模板/ppt模板纯净版.ppt
3 1080 /public/IT服务平台/12-研发软件/
3 2325 /public/IT服务平台/12-研发软件/Java/
3 299891682 /public/IT服务平台/26-NextCloud/Ios_sui_10.1.5_1022.ipa
3 942 /public/IT服务平台/25-客户端下载/
2 1142 /public/IT服务平台/01-常用文档/

统计每个IP访问状态码数量($status)

# 统计2020年1月2日一天内每个IP访问状态码数量
[root@centos11 ~]# awk '/02\/Jan\/2020/{ips_code[$(NF-1)" "$9]++}END{for(i in ips_code){print i,ips_code[i]}}' /usr/local/nginx/logs/access_public.log | sort -k1rn | head -n10
172.22.102.88 200 2
172.22.105.26 200 6
172.22.108.52 200 5
172.22.218.231 200 5
172.22.225.131 200 5
172.22.225.131 206 3
172.22.41.18 200 3
172.22.42.173 200 7
172.22.50.138 200 2
172.22.50.217 200 4

统计每个IP访问状态码为200的出现次数($status)

[root@centos11 ~]# awk '/02\/Jan\/2020/{if($9=="200"){status[$(NF-1)" "$9]++}}END{for(i in status){print i,status[i]}}' /usr/local/nginx/logs/access_public.log | sort -k3rn | head -n10
172.22.72.30 200 22
172.22.50.237 200 16
172.22.69.128 200 12
172.22.42.173 200 7
172.22.105.26 200 6
172.22.85.68 200 6
172.22.108.52 200 5
172.22.218.231 200 5
172.22.225.131 200 5
172.22.70.155 200 5

统计前n分钟的PV量

# 介绍一下date的用法
[root@centos11 ~]# date
Mon Jan  6 21:16:47 CST 2020
# 获取一分钟后的时间
[root@centos11 ~]# date -d '1 min'
Mon Jan  6 21:17:49 CST 2020
# 获取一分钟前的时间: -1 min 或者 1 min ago
[root@centos11 ~]# date -d '-1 min'
Mon Jan  6 21:15:52 CST 2020
[root@centos11 ~]# date -d '1 min ago'
Mon Jan  6 21:15:55 CST 2020


# 统计1分钟前的PV量
[root@centos11 ~]# new_date=$(date -d '-1 minute' +%d/%b/%Y:%H:%M);awk -v date_new=$new_date '$0 ~ date_new {i++} END{print i}' /usr/local/nginx/logs/access_public.log

统计某个时间段内,访问状态码为200

# 统计2019年9月5日09:00-16:00,访问状态码为200的IP
[root@centos11 ~]# awk '$4>="[02/Jan/2020:09:00:00" && $4<="[02/Jan/2020:16:00:00"{if($9=="200"){ip_code[$(NF-1)" "$9]++}}END{for(i in ip_code){print i,ip_code[i]}}' /usr/local/nginx/logs/access_public.log | sort -k3rn
172.22.72.30 200 22
172.22.50.237 200 16
172.22.69.128 200 12
172.22.85.68 200 6
172.22.225.131 200 5
172.22.70.155 200 5
172.22.105.26 200 4
172.22.50.217 200 4
172.22.102.88 200 2
172.22.72.23 200 2

统计某个时间段内,各种状态码的数量

# 统计2019年9月5日09:00-16:00,各种状态码的数量
[root@centos11 ~]# awk '$4>="[02/Jan/2020:09:00:00" && $4<="[02/Jan/2020:16:00:00"{code[$9]++}END{for(i in code){print i,code[i]}}' /usr/local/nginx/logs/access_public.log
200 78
206 3

[root@centos11 ~]# awk '$4>="[02/Jan/2020:09:00:00" && $4<="[02/Jan/2020:16:00:00"{code[$9]++;total++}END{for(i in code){printf i"\t";printf code[i]"\t";printf "%.2f",code[i]/total*100;print "%"}}' /usr/local/nginx/logs/access_public.log
200     78      96.30%
206     3       3.70%

[root@centos11 ~]# awk '$4>="[02/Jan/2020:09:00:00" && $4<="[02/Jan/2020:16:00:00"{code[$9]++;total++}END{for(i in code){printf i"\t";printf code[i]"\t";printf "%.2f%\n",code[i]/total*100}}' /usr/local/nginx/logs/access_public.log
200     78      96.30%
206     3       3.70%

作业

Nginx日志默认格式

$remote_addr $1

$time_local $4

$request $7

$status $9

$body_bytes_sent $10