shell脚本检查统计nginx访问日志access.log

原创 2016年08月29日 23:10:55

1、统计nginx的访问日志,统计访问总数,http状态码信息等

思路:先将access.log日志中的http状态码取出来,在我的nginx.conf配置下,access.log中一般awk ‘{print  $9}’即为http状态码,但为了确保不会出现问题,首先采用grep精确匹配到格式为:HTTP/1.0或HTTP:/1.1 状态码,并用awk去除$2即为http状态码,最后通过wc命令统计。


方法一:

#!/bin/bash

reset_terminal=$(tput sgr0) 
nginx_log_path='/usr/local/nginx/logs/access1.log'

#the log of nginx after filter
nginx_log_awkpath='/usr/local/nginx/logs/mynginx.log'

#filter log only with http code
cat ${nginx_log_path} | grep -ioE "HTTP\/1\.[1|0]\"[[:blank:]][0-9]{3}"| awk '{print $2}' > ${nginx_log_awkpath}


echoFun(){
        echo -e '\E[32m' "$1" $reset_terminal $2
}


check_http_status(){

        http_code_100=$(grep -o '1[0-9][0-9]' ${nginx_log_awkpath} | wc -l)
        http_code_200=$(grep -o '2[0-9][0-9]' ${nginx_log_awkpath} | wc -l)
        http_code_300=$(grep -o '3[0-9][0-9]' ${nginx_log_awkpath} | wc -l)
        http_code_400=$(grep -o '4[0-9][0-9]' ${nginx_log_awkpath} | wc -l)
        http_code_500=$(grep -o '5[0-9][0-9]' ${nginx_log_awkpath} | wc -l)
        http_code_total=$(grep -o '[1-5][0-9][0-9]' ${nginx_log_awkpath} | wc -l)

        echoFun "http status[100+]" "${http_code_100}"
        echoFun "http status[200+]" "${http_code_200}"
        echoFun "http status[300+]" "${http_code_300}"
        echoFun "http status[400+]" "${http_code_400}"
        echoFun "http status[500+]" "${http_code_500}"
        echoFun "http status total" "${http_code_total}"
}

check_http_code(){

        http_code_403=$(grep -o '403' ${nginx_log_awkpath} | wc -l)
        http_code_404=$(grep -o '404' ${nginx_log_awkpath} | wc -l)

        echoFun "http status[403]" "${http_code_403}"
        echoFun "http status[404]" "${http_code_404}"


}



check_http_status
check_http_code

2、运行结果:


方法二:参考网上一些实现方法

实现方法类似,这里运用了awk判断来实现

#!/bin/bash

reset_terminal=$(tput sgr0) 
nginx_log_path='/usr/local/nginx/logs/access1.log'


echoFun(){
        echo -e '\E[32m' "$1" $reset_terminal $2
}


check_http_status(){

        http_status_codes=(`cat ${nginx_log_path} | grep -ioE "HTTP\/1\.[1|0]\"[[:blank:]][0-9]{3}" | awk '{ 
                if($2>=100 && $2<200)
                        {i++}
                else if($2>=200 && $2<300)
                        {j++}
                else if($2>=300 && $2<400)
                        {k++}
                else if($2>=400 && $2<500)
                        {l++}
                else if($2>=500)
                        {m++}
        }END{
       #判断 i存在输出i,否则输出0
         print i?i:0,j?j:0,k?k:0,l?l:0,m?m:0,i+j+k+l+m
        }'
        `)

        echoFun "http status[100+]" "${http_status_codes[0]}"
         echoFun "http status[200+]" "${http_status_codes[1]}"
         echoFun "http status[300+]" "${http_status_codes[2]}"
         echoFun "http status[400+]" "${http_status_codes[3]}"
         echoFun "http status[500+]" "${http_status_codes[4]}"
        echoFun "http status total" "${http_status_codes[5]}"
}

check_http_code(){
        http_code=(`cat ${nginx_log_path} | grep -ioE "HTTP\/1\.[1|0]\"[[:blank:]][0-9]{3}" | awk -v total=0 '{
                if($2!="")
                        {code[$2]++;total++}
                else
                        {exit}
        }END{
        print code[403]?code[403]:0,code[404]?code[404]:0,total
        }'
        `)

        echoFun "http status[403]" "${http_code[0]}"
        echoFun "http status[404]" "${http_code[1]}"
        echoFun "http status tatal" "${http_code[2]}"


}



check_http_status
check_http_code

输出结果:



输出结果是一致的。

这些脚本还需要进行进一步的优化,例如用户可以针对某个时间点甚至是时间段内进行统计。

通过nginx日志利用shell统计日pv和uv

 通过nginx日志利用shell统计日pv和uv 网上记录nginx日志统计访问量的脚本的文档很多,但是看来看去实际都是一个东西,如下: 1.根据访问IP统计UV awk '{p...
  • qq_33324608
  • qq_33324608
  • 2017年05月04日 16:17
  • 2813

nginx 日志访问量统计

1.根据访问IP统计UV awk '{print $1}'  access.log|sort | uniq -c |wc -l 2.统计访问URL统计PV awk '{print $7}' ac...
  • u013636377
  • u013636377
  • 2015年10月14日 17:35
  • 6651

Nginx Access Log日志统计分析常用命令

IP相关统计 统计IP访问量awk ‘{print $1}’ access.log | sort -n | uniq | wc -l 查看某一时间段的IP访问量(4-5点)grep “07/Apr...
  • DiyHzp
  • DiyHzp
  • 2017年06月27日 10:16
  • 1523

使用 awk 命令行快速分析 accesslog访问日志

IBM HTTP Server 访问日志的格式 定义日志的格式 我们可以在 IBM HTTP Server 的配置文件中,使用预定义的经典格式,或者自定义访问日志的格式。下文中如无特别说明...
  • Derek_BMW
  • Derek_BMW
  • 2015年09月15日 17:34
  • 2409

shell脚本分析 nginx日志访问次数最多及最耗时的页面(慢查询)

下面是我在做优化时候,经常用到的一段shell 脚本。 这个也可以算是,统计web页面的slowpage 慢访问页面,象mysql slowquery 当服务器压力比较大,跑起来很费力时候。...
  • qq_34341290
  • qq_34341290
  • 2016年11月26日 11:51
  • 1520

nginx php error log 配置 查找500 错误

nginx与apache不一样,在apache中可以直接指定php的错误日志,那样在php执行中的错误信息就直接输入到php的错误日志中,可以方便查询。 在nginx中,nginx只对页面的访问做a...
  • joshua1830
  • joshua1830
  • 2016年08月16日 10:44
  • 9358

shell脚本统计出日志文件操作以及其对应的平均时间

有如下日志:exmple.log time: 1.236 operation:查询 time: 2.135 operation:处理 time: 3.741 operation:处理 time: ...
  • gongdaxuesheng
  • gongdaxuesheng
  • 2015年08月05日 18:59
  • 825

Nginx 日志文件 访问IP统计

问题描述Nginx访问日志文件内容如下:10.9.40.134 - - [01/Aug/2016:06:29:42 +0800] "POST / HTTP/1.1" 302 0 "-" "python...
  • waltonhuang
  • waltonhuang
  • 2016年08月01日 10:58
  • 5463

通过Nginx,Tomcat访问日志(access log)记录请求耗时

通过Nginx,Tomcat访问日志(access log)记录请求耗时 一、Nginx通过$upstream_response_time $request_time统计请求和后台服务响应时间 ...
  • longtingjing
  • longtingjing
  • 2016年10月28日 15:00
  • 1871

统计nginx日志文件里访问的IP地址

cat nginx.log awk '{a[$1]++;} END{for(i in a) { printf("%s\t%s\n", a[i], i); }}' | sort –bn 统计nginx...
  • slovyz
  • slovyz
  • 2016年11月21日 15:56
  • 1354
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:shell脚本检查统计nginx访问日志access.log
举报原因:
原因补充:

(最多只允许输入30个字)