Nginx日志分析
这里分析的nginx日志包括访问日志access.log和错误日志error.log
访问日志主要记录客户端的请求。客户端向Nginx服务器发起的每一次请求都记录在这里。客户端IP,浏览器信息,referer,请求处理时间,请求URL等都可以在访问日志中得到。当然具体要记录哪些信息,你可以通过log_format指令定义。
错误日志在Nginx中是通过error_log指令实现的。该指令记录服务器和请求处理过程中的错误信息
Nginx中通过access_log和error_log指令配置访问日志和错误日志,通过log_format我们可以自定义日志格式。如果日志文件路径中使用了变量,我们可以通过open_log_file_cache指令来设置缓存,提升性能。
一. 访问日志
access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]]; # 设置访问日志
access_log off; # 关闭访问日志
path 指定日志的存放位置。
format 指定日志的格式。默认使用预定义的combined。
buffer 用来指定日志写入时的缓存大小。默认是64k。
gzip 日志写入前先进行压缩。压缩率可以指定,从1到9数值越大压缩比越高,同时压缩的速度也越慢。默认是1。
flush 设置缓存的有效时间。如果超过flush指定的时间,缓存中的内容将被清空。
if 条件判断。如果指定的条件计算为0或空字符串,那么该请求不会写入日志。
访问日志的作用域
可以应用access_log指令的作用域分别有http,server,location,limit_except。也就是说,在这几个作用域外使用该指令,Nginx会报错。
日志样例:
127.0.0.1 - - [31/Aug/2018:16:11:16 +0800] "GET /50x.html HTTP/1.1" 200 537 "-" "curl/7.29.0"
访问ip、访问时间、请求方式、请求url、响应状态码、响应body体大小、ua
二. 错误日志
错误日志主要记录客户端访问Nginx出错时的日志,格式不支持自定义。通过错误日志,你可以得到系统某个服务或server的性能瓶颈等。因此,将日志好好利用,你可以得到很多有价值的信息。错误日志由指令error_log来指定,具体格式如下:
error_log path(存放路径) level(日志等级)
path含义同access_log,level表示日志等级,日志等级分为[ debug | info | notice | warn | error | crit ],从左至右,日志详细程度逐级递减,即debug最详细,crit最少
需要注意的是:error_log off并不能关闭错误日志,而是会将错误日志记录到一个文件名为off的文件中。正确的关闭错误日志记录功能的方法如下:
error_log /dev/null; 表示将存储日志的路径设置为“垃圾桶”。
三. 统计PV、UV数
3.1. 统计所有的PV数
cat access.log |wc -l
3.2. 统计指定某一天的pv数
cat access.log | sed -n '/03\/Jul\/2023/p' |wc -l
3.3. 根据访问ip统计UV
awk '{print $1}' access.log |sort -n |uniq -c |wc -l
3.4.统计UV
grep "/api" access.log |grep -v "favicon.ico" |grep -v ".jpg" |grep -v ".jpeg" |grep -v ".png" |grep -v ".webp" |grep -v ".css" |grep -v ".js" |grep -v "fonts" |awk '{print $1}' |sort -n |uniq |wc -l
四. IP相关统计
4.1. 统计每个IP访问次数
awk '{print $1}' access.log |sort |uniq -c
或
cat access.log | awk '{count[$1]++}END{for(ip in count){print ip,count[ip]}}'
或
cat access.log | awk '{count[$1]++}END{for(ip in count){print ip"\t"count[ip]}}'|sort -rnk 2 # 按次数倒序排序
4.2. 统计独立IP数量
awk '{print $1}' access.log |sort -n |uniq -c |wc -l
4.3. 查看某一时间段的访问量
查看2023-07-03 12:30:00 到 2023-07-03 12:40:00的访问量
grep '03/Jul/2023:12:[3-4]' access.log |awk '{print $1}' |sort |uniq -c |sort -nr |wc -l
4.4. 查看访问最频繁的前100个IP
awk '{print $1}' access.log |sort -n |uniq -c |sort -rn |head -n 100
4.5. 查看访问100次以上的IP
awk '{print $1}' access.log |sort -n |uniq -c |awk '{if($1>100) print $0}' |sort -rn
4.6. 查询某个IP的详细访问情况,按访问频率排序
grep "127.0.0.1" access.log |awk '{print $7}' |sort |uniq -c |sort -rn |head -n 100
五. 页面访问统计
5.1. 查看访问最频繁的api(top100)
awk '{print $7}' access.log |sort |uniq -c |sort -rn |head -n 100
5.2. 查看访问最频繁的页面(top100,排除/api/test)
grep -v '/api/test' access.log |awk '{print $7}' |sort |uniq -c |sort -rn |head -n 100
5.3. 查询访问最频繁的api
awk '{print $7}' access.log |sort |uniq -c |sort -n -k 1 -r |more
5.4. 查询页面访问次数超过100次的api
cat access.log |cut -d ' ' -f 7 | sort |uniq -c | awk '{if ($1 > 100) print $0}' |less
5.5. 查看最近1000条记录,访问量最高的页面
tail -1000 access.log |awk '{print $7}'|sort|uniq -c|sort -nr|less
5.6. 统计ua访问次数
cat access.log|awk -F'"' '{count[$(NF-1)]++}END{for(ua in count){print count[ua],ua}}' |sort -rnk 1
5.7. 过滤含有iphone的ua
cat access.log |awk -F'"' '$(NF-1) ~ /iPhone/'
六. 每秒/每分/每小时请求量统计
6.1. 统计每秒的请求数,top100的时间点(精确到秒)
awk '{print $4}' access.log |cut -c 14-21|sort|uniq -c|sort -nr|head -n 100
6.2. 统计每分钟的请求数,top100的时间点(精确到分钟)
awk '{print $4}' access.log |cut -c 14-18|sort|uniq -c|sort -nr|head -n 100
6.3. 每小时的请求数,top100的时间点(精确到小时)
awk '{print $4}' access.log |cut -c 14-15|sort|uniq -c|sort -nr|head -n 100
6.4. 统计每分钟的请求数
cat access.log |awk '{print $4}'|awk -F':' '{print $1":"$2":"$3}'|awk '{count[$1]++}END{for(time in count){print time,count[time]}}'
6.5. 统计每秒钟请求数(并发)
cat access.log|awk '{count[$4]++}END{ for(time in count){print time,count[time]} }'
七. 状态码统计
7.1. 统计各个状态码的数量
cat access.log |awk '{count[$9]++}END{for(ip in count){print ip,count[ip]}}'
7.2. 状态码比例统计
保留小数
cat access.log |awk '{count[$9]++}END{for(status in count){print status,count[status]/NR*100"%"}}'
保留整数
cat access.log|awk '{count[$9]++}END{for(status in count){print status"\t"int(count[status]/NR*100)"%"}}'
7.3. 统计正常状态码请求
cat access.log|awk '$9~/^2/'
7.4. 统计服务器异常状态码请求
cat access.log|awk '$9~/^5/'
7.5. 统计客户端异常状态码请求
cat access.log|awk '$9~/^4/'
八. 性能分析
在nginx log中最后一个字段加入$request_time
8.1. 列出传输时间超过 3 秒的页面,显示前20条
cat access.log|awk '($NF > 3){print $7}'|sort -n|uniq -c|sort -nr|head -20
8.2. 列出/api/v1/login请求时间超过3秒的页面,并统计其出现的次数,显示前100条
cat access.log|awk '($NF > 3 && $7~/\/api\/v1\/login/){print $7}'|sort -n|uniq -c|sort -nr|head -100