Nginx 日志常用操作

Nginx 日志常用操作

Nginx日志分析统计,复制PaaS平台日志到/opt下开始分析

说明:nginx.conf 中 log_format 格式定义完成后需要在 access_log 中引用main 配置
例:

$ cat nginx.conf
...
http {
...
      log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                                        '"$status" $body_bytes_sent "$http_referer" '
                                        '"$http_user_agent" "$http_x_forwarded_for" '
                                        '"$gzip_ratio" $request_time $bytes_sent $request_length';  
...
}

$ cat server.conf
server {
...
access_log  /logs/nginx/server.log main;
...
}
...

$ tail /logs/nginx/server.log
172.27.16.112 - - [07/Dec/2020:15:38:00 +0800] "POST /api/c/compapi/v2/cc/search_biz_inst_topo HTTP/1.1" "200" 7108 "-" "python-requests/2.9.1" "-" "-" 0.031 7345 369
172.27.16.112 - - [07/Dec/2020:15:38:00 +0800] "POST /api/c/compapi/v2/cc/get_biz_internal_module HTTP/1.1" "200" 288 "-" "python-requests/2.9.1" "-" "-" 0.033 525 396
  • 根据访问IP统计UV --(截图包含命令)
# 方法一
$ awk '{print $1}' paas_inner_access.log |sort |uniq -c|wc -l

# 方法二
$ awk '{ip[$1]++}END{for (i in ip)print i|"wc -l"}' paas_inner_access.log

# 方法三
$ cut -d ' ' -f1 paas_inner_access.log |sort |uniq -c|wc -l
  • 根据访问URL统计PV --(截图包含命令)
# 方法一
$ awk '{print $7}' paas_inner_access.log |wc -l 

# 方法二
$ cut -d ' ' -f7 paas_inner_access.log |wc -l
  • 统计访问最多的前10个页面 --(截图包含命令)
# 方法一
$ awk '{print $7}' paas_inner_access.log|sort | uniq -c |sort -rnk 1|head

# 方法二
$ awk '{url[$7]++}END{for (i in url)print url[i], i}' paas_inner_access.log|sort -rnk1|head

# 方法三
$ awk '{url[$7]++}END{for (i in url)print url[i], i|"sort -rnk1|head"}' paas_inner_access.log
  • 统计访问最频繁的IP --(截图包含命令)
# 方法一
$ cut -d ' ' -f1 paas_inner_access.log |sort |uniq -c|sort -rnk1|head -1

# 方法二
$ awk '{print $1}' paas_inner_access.log |sort |uniq -c|sort -rnk1|head -1
  • 根据时间段统计查看日志 --(截图包含命令)
# 方法一
$ sed -n '/07\/Dec\/2020:14:44/,/07\/Dec\/2020:14:45/p' paas_inner_access.log

# 方法二 
# 以下 awk 中split 表示将第4字段中的字符通过'['进行分割,并将分割后的值存储在array数组中
$ awk '{split($4,array,"[");if(array[2]>="07/Dec/2020:14:44" && array[2]<="07/Dec/2020:14:45"){print $0}}' paas_inner_access.log
  • 统计当日的的pv和uv --(截图包含命令)
# pv
cat paas_inner_access.log|sed -n /`date "+%d\/%b\/%Y"`/p |awk '{print $7}' |sort|wc -l

# uv
cat paas_inner_access.log|sed -n /`date "+%d\/%b\/%Y"`/p |awk '{print $1}' |sort|uniq -c |wc -l

  • 统计每日的pv
# 以下awk 中substr 表示取第4字段中2到11个字符
$ awk '{date[substr($4,2,11)]++}END{for (i in date)print "TIME: "i,"PV: "date[i]}' paas_inner_access.log

  • 获取最耗时的请求时间、url、耗时 --(截图包含命令)
# 方法一    # 比较耗时 且效率不高
$ cat read_t.sh 
#!/bin/bash

num=0
while read line;
do
  request_time=`echo $line|awk '{print $(NF-2)}'`
  if (( $(echo "$request_time > $num"|bc -l) ));then
    num=$request_time
    connext=$line
  fi
done < $1

echo $num
echo $connext|awk '{print $4,$5,$7,$(NF-2)}'

$ time ./read_t.sh paas_inner_access.log
real	2m31.721s
user	0m53.884s
sys	0m55.243s

# 方法二
$ time awk '{print $4,$5,$7,$(NF-2)}' paas_inner_access.log |sort -rnk4|head -1
real	0m0.185s
user	0m0.203s
sys	0m0.010s
  • 获取每分钟的请求数量 --(截图包含命令)
$ awk '{count[substr($4,2,17)]++}END{for (i in count)print i,count[i]|"sort"}' paas_inner_access.log
  • 查看某个时间段之间的ip访问个数 --(截图包含命令)
    此题按我理解应该是某个时间段每个ip的访问次数
# 如果只是单单统计某个时间段ip的访问个数

$ sed -n '/08\/Dec\/2020:09:09/,/08\/Dec\/2020:09:15/p' paas_inner_access.log|awk '{ip[$1]++}END{for (i in ip)print i,ip[i]}'

# 此命令是统计某个时间段每个ip的访问次数
$ sed -n '/08\/Dec\/2020:09:09/,/08\/Dec\/2020:09:15/p' paas_inner_access.log|awk '{ip[$1]++}END{for (i in ip)print i,ip[i]}'
  • 统计每个URL访问内容的总大小 --(截图包含命令)
# size[$7]+=$10 表示匹配第七列相同的值,将它们第十列的数值相加并赋值
$ awk '{a[$7]++;size[$7]+=$10}END{for(i in a)print a[i],i,size[i]|"sort -rnk3"}' paas_inner_access.log

# 输出如下
请求数量   URL  字节大小
7928 /api/c/compapi/data/maple/get_data 49767974
1361 /api/c/compapi/v2/cc/search_host 20226676
1642 /api/c/compapi/v2/cc/search_biz_inst_topo 11670358
 
posted @ 2025-05-13 13:38  金元  阅读(12)  评论(0)    收藏  举报