nginx 日志分析,python 实现

环境:
   
  OS:
     Linux: Linux version 2.6.32-431.el6.x86_64 ([email protected])                                                 x
     Build: (gcc version 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC) )                                                                    x
     Release  : 2.6.32-431.el6.x86_64                                                                                                x
     Version  : #1 SMP Fri Nov 22 03:15:09 UTC 2013                                                                                  x
     cpuinfo: GenuineIntel Intel(R) Core(TM) i3 CPU	  M 380  @ 2.53GHz                                                           x
     cpuinfo: Hz=2527.069 bogomips=5054.13                                                                                           x
     cpuinfo: ProcessorChips=1 PhyscalCores=2                                                                                        x
     cpuinfo: Hyperthreads  =0 VirtualCPUs =2
     
  Python:Python 3.5.1 
  
  功能:
      1. 支持总访问量和总流量的分析;
      2. 支持HTTP个状态码的统计分析;
      3. 支持对结构进行指定条目显示;
      4. 支持分析指定时间内的统计;

#!/usr/bin/env python3
#-*- coding: utf8 -*-

import fileinput 
import re
import time
from collections import Counter
import math
import sys
from datetime import datetime, timedelta

#初始化显示的日志条目,None表示显示全部
records = None
     
#脚本使用方法
def usage():
    print(‘Usage: %s nginx_log_file [max_record_nums] [datetime]‘ % sys.argv[0])
    print(‘Usage: [max_record_nums] for int number. eg: 10 ‘)
    print(‘Usage: [datetime] for [5d | 5h | 5m | 5s] for [5 days | 5 hours | 5 minutes | 5 seconds]‘)
    print(‘eg: ./ngx.py /var/log/nginx/access.log [10] [5d | 5h | 5m | 5s]‘)
    sys.exit(0)

#过去多长时间的时间点时间戳
def tmstamp():
    if len(sys.argv) <= 3:
        #return datetime.now().timestamp()
        return 0
    elif re.match(‘^[\d]+d$‘, sys.argv[3]):
        return (datetime.now() - timedelta(days=float(sys.argv[3].rstrip(‘d‘)))).timestamp()
    elif re.match(‘^[\d]+h$‘, sys.argv[3]):
        return (datetime.now() - timedelta(hours=float(sys.argv[3].rstrip(‘h‘)))).timestamp()
    elif re.match(‘^[\d]+m$‘, sys.argv[3]):
        return (datetime.now() - timedelta(minutes=float(sys.argv[3].rstrip(‘m‘)))).timestamp()
    elif re.match(‘^[\d]+s$‘, sys.argv[3]):
        return (datetime.now() - timedelta(seconds=float(sys.argv[3].rstrip(‘s‘)))).timestamp()
    else:
        usage()

#转换字节单位
def convertBytes(bytes, lst=[‘B‘,‘KB‘,‘MB‘,‘GB‘,‘TB‘,‘PB‘]):
    i = int(math.floor(math.log(bytes, 1024)))
    if i >= len(lst):
        i = len(lst) - 1
    return (‘%.2f ‘ + lst[i]) % (bytes/math.pow(1024, i))

#日志解析生成器
def ngx():
    try:
        with fileinput.input(sys.argv[1]) as f:
            for line in f:
                ip,_,_,dtime, _, mthd, _, _, status, size, *_ = re.split(‘[\s"]+‘, line)
                dtstamp = time.mktime(time.strptime(dtime.lstrip(‘[‘), ‘%d/%b/%Y:%H:%M:%S‘))
                yield [ip, status, size, dtstamp]
    except:
        usage()
    

# 参数判断
if len(sys.argv) < 2 or len(sys.argv) > 4:
    usage()
if len(sys.argv) < 3:
    records = None
elif len(sys.argv) == 3:
    try:
        re.match(‘[\d]+‘, sys.argv[2])
        records = int(sys.argv[2])
    except:
        usage()
elif len(sys.argv) == 4:
    try:
        re.match(‘^[\d]+[dhms]$‘, sys.argv[3])
    except:
        usage()
            

#初始化各统计变量
iptotal, ipsize, ip200, ip302, ip304, ip403, ip404, ip500, ip502, ip503, totsize =  Counter(), Counter(), Counter(), Counter(), Counter(), Counter(), Counter(), Counter(), Counter(), Counter(), 0

#定义映射表头
header = [‘ip‘, ‘statuscode‘, ‘size‘, ‘dtstamp‘]

#进行迭代统计
for line in ngx():
    #将两个列表转换为字典
    datadict = dict(zip(header, line))

    #统计n天/时/分/秒之前的访问量和带宽等信息
    if datadict[‘dtstamp‘] > tmstamp():

        #每个IP的流量带宽
        ipsize[datadict[‘ip‘]] += int(datadict[‘size‘])

        #总流量
        totsize += int(datadict[‘size‘])

        #每IP的总访问量
        iptotal[datadict[‘ip‘]] += 1
        
        #统计个状态码的请求数
        if datadict[‘statuscode‘] == ‘200‘:
            ip200[datadict[‘ip‘]] += 1
        elif datadict[‘statuscode‘] == ‘302‘:
            ip302[datadict[‘ip‘]] += 1
        elif datadict[‘statuscode‘] == ‘304‘:
            ip304[datadict[‘ip‘]] += 1
        elif datadict[‘statuscode‘] == ‘403‘:
            ip403[datadict[‘ip‘]] += 1
        elif datadict[‘statuscode‘] == ‘404‘:
            ip404[datadict[‘ip‘]] += 1
        elif datadict[‘statuscode‘] == ‘500‘:
            ip500[datadict[‘ip‘]] += 1
        elif datadict[‘statuscode‘] == ‘502‘:
            ip502[datadict[‘ip‘]] += 1
        elif datadict[‘statuscode‘] == ‘503‘:
            ip503[datadict[‘ip‘]] += 1

#判断是否有存在数据,存在则打印,否则,输出错误信息!
if totsize:
    #打印网站总流量,总访问量
    print("\nTotal traffic : %s  Total request times : %d\n" % (convertBytes(totsize),sum(iptotal.values())))

    #打印表头
    print(‘%-15s %-10s %-12s %-8s %-8s %-8s %-8s %-8s %-8s %-8s %-8s‘ %(‘Ip‘, ‘Times‘, ‘Traffic‘ , ‘200‘, ‘302‘, ‘304‘, ‘403‘, ‘404‘, ‘500‘, ‘502‘, ‘503‘))

    print(‘%-15s %-10s %-12s %-8s %-8s %-8s %-8s %-8s %-8s %-8s %-8s‘ %(‘-‘*15, ‘-‘*10, ‘-‘*12, ‘-‘*8, ‘-‘*8, ‘-‘*8, ‘-‘*8, ‘-‘*8, ‘-‘*8, ‘-‘*8, ‘-‘*8))
    #打印前多少条数据
    #for k, v in sorted(iptotal.items(), key=lambda v: v[1], reverse=True):
    for k, v in iptotal.most_common(records):
        print(‘%-15s %-10s %-12s %-8s %-8s %-8s %-8s %-8s %-8s %-8s %-8s‘ % (k, v, convertBytes(ipsize[k]), ip200[k], ip302[k], ip304[k], ip403[k], ip404[k], ip500[k], ip502[k], ip503[k]))

else:
    print(‘Not found data!‘)

效果图:

时间: 2024-10-29 19:08:33

nginx 日志分析,python 实现的相关文章

nginx日志分析利器GoAccess(转)

面试的时候一定会被面到的问题是:给出web服务器的访问日志,请写一个脚本来统计访问前10的IP有哪些?访问前10的请求有哪些?当你领略过goaccess之后,你就明白,这些问题,除了考验你的脚本背诵记忆能力以外,唯一的作用只有装A或者装C了. 对于nginx日志分析,有很多工具,衡量好坏的标准大概就是三快:安装快,解析快,上手快.满足这三点的goaccess确实是居家必备良药. 话说这个标题其实有点委屈GoAccess了,它是一个日志分析工具,并不只是为nginx使用的.你也可以用它来分析apa

nginx日志分析利器GoAccess

面试的时候一定会被面到的问题是:给出web服务器的访问日志,请写一个脚本来统计访问前10的IP有哪些?访问前10的请求有哪些?当你领略过goaccess之后,你就明白,这些问题,除了考验你的脚本背诵记忆能力以外,唯一的作用只有装A或者装C了. 对于nginx日志分析,有很多工具,衡量好坏的标准大概就是三快:安装快,解析快,上手快.满足这三点的goaccess确实是居家必备良药. 话说这个标题其实有点委屈GoAccess了,它是一个日志分析工具,并不只是为nginx使用的.你也可以用它来分析apa

ELKR分布式搭建nginx日志分析系统

ELKR分布式搭建nginx日志分析系统 一.名词介绍 1.什么是elk ELK 其实并不是一款软件,而是一整套解决方案,是三个软件产品的首字母缩写,Elasticsearch,Logstash 和 Kibana.这三款软件都是开源软件,通常是配合使用. 2.Elasticsearch 2.1.Elasticsearch介绍 Elasticsearch 是一个实时的分布式搜索和分析引擎,它可以用于全文搜索,结构化搜索以及分析.它是一个建立在全文搜索引擎 Apache Lucene 基础上的搜索引

ELK系列二:kibana操作及nginx日志分析图表创建

本文主要介绍kibana4的基本操作,nginx日志分析饼形图.柱形图.客户端地理位置分布图等相关图表创建. 一.kibana基本操作 1.面板介绍 Settings:创建索引 Discover:查询数据,选择左上角的下拉按钮,可以选择相应的索引查找数据 Visualize:统计图表 Dashboard:显示面板,添加相应的图表在面板中 2.创建索引 索引创建时,按照不同的类型建,Time-field要选择@timestamp不选的话在discover面板中不出现时间过滤控件 二.饼形图创建(分

【分享】Nginx日志分析(上)

在很多时候,我们会非常关注网站的访问量,比如网站的日PV是多少.网站某个功能上线之后点击量是多少,像这些东西都是需要从web容器中的访问日志统计出来的,下面我们看一下如何在nginx中统计网站的访问信息 1.设置Nginx访问日志记录格式 在默认情况下,nginx只是记录相关get信息,像post页面是不记录的,所以下面需要修改nginx.conf,让其访问日志记录post等请求信息,在nginx.conf中server段中加入如下信息 log_format  access  '$remote_

Goaccess---良心nginx日志分析工具

Goaccess是一个非常良心的开源软件,它的良心之处体现在如下方面: 1)安装简单: 2)操作容易: 3)界面酷炫: 安装Goaccess十分的简单,在centos里直接#yum install goaccess,如果yum源里没有goaccess,可以先安装epel.安装epel的方法如下: wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm wget http://rpms.famil

Nginx 日志分析及性能排查

最近一直在做性能排查,思路就是根据分析Nginx日志,得到响应耗时的url.以及请求时间,再得到这段时间的请求量,并发量,分析是并发的原因,还是本身就比较慢,如果是应用本身的原因,只需要找到对应的代码,然后进行优化就好了 找到的几个原因,基本就是后端sql运行的比较多,单次访问看不出来,但是人比较多的时候就比较慢了,人少的时候20-200毫秒,人多的时候,200-6000毫秒,优化之后基本保持在几十毫秒,优化策略就是减少不必要的sql,加上缓存,基本解决了卡顿的问题,顺便把这次用的一系列命令记录

ELK安装配置及nginx日志分析

一.ELK简介1.组成ELK是Elasticsearch.Logstash.Kibana三个开源软件的组合.在实时数据检索和分析场合,三者通常是配合使用,而且又都先后归于 Elastic.co 公司名下,故有此简称.Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等.Logstash是一个完全开源的工具,它可以对你的日志进行收集.分析,并将其存储供以后使用.kibana 是一个开源和

使用elk+redis搭建nginx日志分析平台

logstash,elasticsearch,kibana 怎么进行nginx的日志分析呢?首先,架构方面,nginx是有日志文件的,它的每个请求的状态等都有日志文件进行记录.其次,需要有个队列,redis的list结构正好可以作为队列使用.然后分析使用elasticsearch就可以进行分析和查询了. 我们需要的是一个分布式的,日志收集和分析系统.logstash有agent和indexer两个角色.对于agent角色,放在单独的web机器上面,然后这个agent不断地读取nginx的日志文件

ELK系列一:ELK安装配置及nginx日志分析

本文分三个部分介绍了elk.elk安装配置及基于filebeat分析nginx日志的配置. 第一部分:elk介绍 一.什么是elk ELK 其实并不是一款软件,而是一整套解决方案,是三个软件产品的首字母缩写,Elasticsearch,Logstash 和 Kibana.这三款软件都是开源软件,通常是配合使用. 二.Elasticsearch 1.Elasticsearch介绍 Elasticsearch 是一个实时的分布式搜索和分析引擎,它可以用于全文搜索,结构化搜索以及分析.它是一个建立在全