nginx常用日志分析及其统计

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
posted @ 2023-07-21 10:05  寻梦99  阅读(407)  评论(0)    收藏  举报