nginx中access.log 的日志结构:
$remote_addr #客户端地址ip
$remote_user #客户端用户名称
$time_local #访问时间和时区
$request #请求的URI和HTTP协议
$http_host #请求地址
$status #HTTP请求状态
$upstream_status #upstream状态
$body_bytes_sent #发送给客户端文件内容大小
$http_referer #URL跳转来源
$http_user_agent #用户终端浏览器等信息
$ssl_protocol #SSL协议版本
$ssl_cipher #交换数据中的算法
$upstream_addr #upstream的地址
$request_time #整个请求的总时间
$upstream_response_time #upstream响应时间
常用操作命令
根据访问IP统计UV
awk '{print $1}' access.log|sort | uniq -c |wc -l
根据访问url统计PV量
awk '{print $7}' access.log | wc -l
查询访问最频繁的URL
awk '{print $7}' access.log|sort | uniq -c |sort -n -k 1 -r|more
查询访问最频繁的IP
awk '{print $1}' access.log|sort | uniq -c |sort -n -k 1 -r|more
查询传输时间超过3秒的页面
cat access.log |awk '($NF > 3){print $7}'|sort -n|uniq -c|sort -nr|head -20
统计某路由平均响应时间
grep "/" access.log | awk '{print $NF}' | grep -P '\d{3}?$' | awk '{sum += $0;}END {if(sum==0)print 0;else print sum/NR}'
获取每分钟的请求数量,输出到文件
cat access.log | awk '{print substr($4,14,5)}' | uniq -c | awk '{print $2","$1}' > access.txt
日志截取
# 从总日志文件中截取昨天一整天的数据出来,并覆盖到新文件中:
cat access.log | awk '$4 >="[14/Mar/2023:00:00:00" && $4 <="[14/Mar/2023:23:59:59"' > access.2023051010.log
将某一时间段的日志输出到文件中
打印一天的日志
cat access.log | egrep "2023-05-04" > test.log
# 打印一小时的日志
cat access.log | egrep "04/Jun/2023:10" > test.log
#打印任意时间段的日志
sed -n '/04\/Jun\/2023:10/,/04\/Jun\/2023:12/p' access.log > test.log
备注
sort 排序
sort 默认是升序,sort -r 降序
sort -u 去除重复行
uniq 去重
-i 忽略大小写字符
-c 进行计数
-u 只显示唯一的行
cut 从文件文件中截取
-d 后接分割字符
-f 依据-d的分隔符将信息分割成数段,-f 取出第几段
-c 以字符的单位取出固定字符区间
wc 统计文件里面有多少单词,多少行,多少字符
-l :仅列出行
-w :仅列出多少字(英文单字)
-m :多少字符
最后提供一个综合有用的脚本
#!/bin/bash
#此脚本用于统计nginx日志当前时间n分钟之内不同接口的访问量统计
LOG=/mnt/data/nginx-1.20.1/logs/access.log
TMP=/tmp/url.tmp
URLSTATS=mnt/data/nginx-1.20.1/logs/urlstats.log
#删除临时统计文件
[ -f $TMP ] && rm -fr $TMP
for i in `seq 15`
do
d=`date +%d/%h/%Y:%H:%M -d "$i minutes ago"`
#将每个时间段的URL进行统计并追加到临时文件
awk -v b="$d" '{if ($4 ~ b)a[$7]++}END{for(i in a)printf("%-42s %-d\n", i,a[i])}' $LOG >> $TMP
done
#将汇总到临时文件的URL统计进行汇总
if [ -s $TMP ];then
awk '{a[$1]+=$2;}END{for(i in a)printf("%-42s %-d\n", i,a[i])}' $TMP | sort -nr -k2 > $URLSTATS
else
echo "没有统计到相关数据"
fi