环境说明

python3+

pip install geoip2==2.9.0

nginx日志配置成json格式,配置如下:

log_format json_log '{ "time": "$time_local", '
'"remote_addr": "$remote_addr", '
'"remote_user": "$remote_user", '
'"body_bytes_sent": "$body_bytes_sent", '
'"request_time": "$request_time", '
'"status": "$status", '
'"request": "$request", '
'"request_method": "$request_method", '
'"http_referrer": "$http_referer", '
'"body_bytes_sent":"$body_bytes_sent", '
'"http_x_forwarded_for": "$http_x_forwarded_for", '
'"http_user_agent": "$http_user_agent"}';

配置日志成json格式

生成的日志如下:

配置脚本

#encoding: utf-8
import os
import sys
import json
from datetime import datetime
from geoip2.database import Reader logfile = sys.argv[1]
BASE_DIR = os.path.dirname(os.path.abspath(__file__)) def stat_days(infile):
"""
统计每天日志数据
"""
day_data = {}
with open(infile, 'r', encoding="utf-8") as fhandler:
for line in fhandler.readlines():
try:
line=line.strip('\n')
#print('---------------')
#print(line)
dict_line = json.loads(line) # ip datetime method url status bytes
#dict_line['remote_addr'] dict_line['time'] dict_line['request_method'] dict_line['request'] dict_line['status'] dict_line['body_bytes_sent']
#_day = datetime.strptime(dict_line['time'], '%d/%b/%Y:%H:%M:%S').strftime('%Y-%m-%d')
_day = '2018-11-29'
#设置每天的默认值
day_data.setdefault(_day, {'hits': 0, 'vistors': {}, 'status': {}, 'bytes': 0})
#设置每天出现的IP访问次数默认为0
day_data[_day]['vistors'].setdefault(dict_line['remote_addr'], 0)
#设置每天出现的状态码默认值为0
day_data[_day]['status'].setdefault(dict_line['status'],0) #统计数据
day_data[_day]['hits'] += 1
day_data[_day]['vistors'][dict_line['remote_addr']] += 1
day_data[_day]['status'][dict_line['status']] += 1
day_data[_day]['bytes'] += int(dict_line['body_bytes_sent']) if dict_line['body_bytes_sent'].isdigit() else 0
except Exception as err:
continue
return sorted(day_data.items(), key=lambda x:x[0]) def stat_total(days):
"""
统计总数据
"""
total_data = {'hits': 0, 'vistors': {}, 'status': {}, 'bytes': 0} for _day, _stat in days:
total_data['hits'] += _stat['hits']
total_data['bytes'] += _stat['bytes'] for _ip, _cnt in _stat['vistors'].items():
total_data['vistors'].setdefault(_ip, 0)
total_data['vistors'][_ip] += _cnt for _status, _cnt in _stat['status'].items():
total_data['status'].setdefault(_status, 0)
total_data['status'][_status] += _cnt
return total_data def stat_region(total_data):
"""
统计区域
"""
region_data = {}
region_location = {} #打开maxmind mmdb文件
geoip2_reader = Reader(os.path.join(BASE_DIR, 'db', 'GeoLite2-City.mmdb')) for _ip, _cnt in total_data['vistors'].items():
try:
_city = geoip2_reader.city(_ip) #只显示国内IP地址
#if _city.country.names.get('zh-CN', '') != '中国':
#continue
#获取国家和城市信息
_city_name = '{}/{}'.format(_city.country.names.get('zh-CN', ''), _city.city.names.get('zh-CN', ''))
region_data.setdefault(_city_name, 0) #统计每天城市发生访问次数
region_data[_city_name] += _cnt
except Exception as err:
print(err) #关闭文件
geoip2_reader.close()
return region_data def formatSize(bytes):
bytes = float(bytes)
kb = bytes / 1024
if kb >= 1024:
M = kb /1024
if M >= 1024:
G = M /1024
return "{} G".format(G)
else:
return "{} M".format(M)
else:
return "{} K".format(kb) def main(infile):
"""
主程序
"""
#获取各种统计结果
day_data = stat_days(infile) #每天统计项
total_data = stat_total(day_data) #总统计项
region_data = sorted(stat_region(total_data).items(), key=lambda x:x[1], reverse=True)
status_data = total_data['status'] access_num = total_data['hits']
ip_num = len(total_data['vistors'])
ip_detail = sorted(total_data['vistors'].items(), key=lambda x:x[1], reverse=True)
traffic = formatSize(total_data['bytes']) print("""
总访问量: {}
总IP数: {}
总流量: {} """.format(access_num, ip_num, traffic))
print('\n-------Top 15 地区访问分布-------')
for region in region_data[0:15]:
print("{}:{}".format(region[0], region[1])) print('\n-------Top 15 ip访问-------')
for ip in ip_detail[0:15]:
print("{} {}".format(ip[0], ip[1])) print('\n-------状态码情况-------')
for code, cnt in status_data.items():
print("{} {}".format(code, cnt)) if __name__ == "__main__":
main(logfile)

logganalysis.py

python解析Nginx访问日志的更多相关文章

  1. python统计apache、nginx访问日志IP访问次数并且排序(显示前20条)【转】

    前言:python统计apache.nginx访问日志IP访问次数并且排序(显示前20条).其实用awk+sort等命令可以实现,用awk数组也可以实现,这里只是用python尝试下.   apach ...

  2. 一、基于hadoop的nginx访问日志分析---解析日志篇

    前一阵子,搭建了ELK日志分析平台,用着挺爽的,再也不用给开发拉各种日志,节省了很多时间. 这篇博文是介绍用python代码实现日志分析的,用MRJob实现hadoop上的mapreduce,可以直接 ...

  3. Python正则表达式,统计分析nginx访问日志

    目标: 1.正则表达式 2.oop编程,统计nginx访问日志中不同IP地址出现的次数并排序 1.正则表达式 #!/usr/bin/env python # -*- coding: utf-8 -*- ...

  4. 使用python找出nginx访问日志中访问次数最多的10个ip排序生成网页

    使用python找出nginx访问日志中访问次数最多的10个ip排序生成网页 方法1:linux下使用awk命令 # cat access1.log | awk '{print $1" &q ...

  5. 按日期切割nginx访问日志--及性能优化

    先谈下我们需求,一个比较大的nginx访问日志,根据访问日期切割日志,保存在/tmp目录下. 测试机器为腾讯云机子,单核1G内存.测试日志大小80M. 不使用多线程版: #!/usr/bin/env ...

  6. 采集并分析Nginx访问日志

    日志服务支持通过数据接入向导配置采集Nginx日志,并自动创建索引和Nginx日志仪表盘,帮助您快速采集并分析Nginx日志. 许多个人站长选取了Nginx作为服务器搭建网站,在对网站访问情况进行分析 ...

  7. Logstash+ElasticSearch+Kibana处理nginx访问日志(转)

    ELK似乎是当前最为流行的日志收集-存储-分析的全套解决方案. 去年年初, 公司里已经在用, 当时自己还山寨了一个统计系统(postgresql-echarts, 日志无结构化, json形式存储到p ...

  8. nginx访问日志分析,筛选时间大于1秒的请求

    处理nginx访问日志,筛选时间大于1秒的请求   #!/usr/bin/env python ''' 处理访问日志,筛选时间大于1秒的请求 ''' with open('test.log','a+' ...

  9. Nginx 访问日志轮询切割

    Nginx 访问日志轮询切割脚本 #!/bin/sh Dateformat=`date +%Y%m%d` Basedir="/application/nginx" Nginxlog ...

随机推荐

  1. NOIP 2014 提高组 Day1

    期望得分:100+100+50=250 实际得分:100+100+50=250 此次NOIP  ZJ省一分数线:500,SD:345 https://www.luogu.org/problem/lis ...

  2. 【费用流】【CODEVS】1227 方格取数2

    [算法]最小费用最大流(费用流) [题解] 费用流:http://www.cnblogs.com/onioncyc/p/6496532.html 本题构图: 在有限的k次行走中尽可能多的拿到数字,明显 ...

  3. 【BZOJ】2004: [Hnoi2010]Bus 公交线路 状压DP+矩阵快速幂

    [题意]n个点等距排列在长度为n-1的直线上,初始点1~k都有一辆公车,每辆公车都需要一些停靠点,每个点至多只能被一辆公车停靠,且每辆公车相邻两个停靠点的距离至多为p,所有公车最后会停在n-k+1~n ...

  4. layui结合mybatis的pagehelper插件的分页通用的方法

    总体思路: 1.前台查询的时候将当前页和页大小传到后台 2.后台将当前页,页大小以及数据与数据总数返回前台,前台显示完表格完数据之后显示分页插件. 前台页面: 准备查询条件的表单,与数据表格,分页di ...

  5. 64_s3

    sugar-toolkit-gtk3-devel-0.110.0-2.fc26.i686.rpm 13-Feb-2017 10:56 22626 sugar-toolkit-gtk3-devel-0. ...

  6. 多播知识by 陈胜君

    简单的讲一下多拨的说明:一.多拨分物理多拨和虚拟多拨. 物理多拨是电信老套餐,就是一个宽带支持四个内网设备同时拨号上网,即2004年以前,允许家里四台电脑直接连LAN网口启动拨号,同时允许四拨在线.现 ...

  7. 端口扫描———nmap

    nmap教程之nmap命令使用示例(nmap使用方法) 浏览:8268 | 更新:2014-03-29 17:23 Nmap是一款网络扫描和主机检测的非常有用的工具.Nmap是不局限于仅仅收集信息和枚 ...

  8. 最直白、最易懂的话带你认识和学会---数据分析基础包之numpy的使用

    前言 numpy是一个很基础很底层的模块,其重要性不言而喻,可以说对于新手来说是最基础的入门必须要学习的其中之一.在很多数据分析,深度学习,机器学习亦或是人工智能领域的模块中,很多的底层都会用到这个模 ...

  9. PHP 执行系统外部命令的函数- system() exec() passthru()

    PHP 执行系统外部命令的函数: system() exec() passthru()区别:system() 输出并返回最后一行shell结果.exec() 不输出结果,返回最后一行shell结果,所 ...

  10. 洛谷 P2871 [USACO07DEC]手链Charm Bracelet 题解

    题目传送门 这道题明显就是个01背包.所以直接套模板就好啦. #include<bits/stdc++.h> #define MAXN 30000 using namespace std; ...