环境说明

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. Mock InjectMocks ( @Mock 和 @InjectMocks )区别

    之前一直对这两个注解的区别不是很明白. 搜到过一篇博客园的文章举例说明了代码行为的区别.后来在stackoverflow上看到一个问答简单明了的解释了这两个注解在定义上的区别: 在此翻译记录一下: / ...

  2. 【BZOJ】3052: [wc2013]糖果公园 树分块+带修改莫队算法

    [题目]#58. [WC2013]糖果公园 [题意]给定n个点的树,m种糖果,每个点有糖果ci.给定n个数wi和m个数vi,第i颗糖果第j次品尝的价值是v(i)*w(j).q次询问一条链上每个点价值的 ...

  3. SDUT 3917

    UMR 现在手里有 n 张康纳的表情,最上面一张是玛吉呀巴库乃.现在 UMR 如果每次把最上面的 m 张牌移到最下面而不改变他们的顺序及朝向,那么至少经过多少次移动玛吉呀巴库乃才会又出现在最上面呢? ...

  4. 【leetcode 简单】第十一题 搜索插入位置

    给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引.如果目标值不存在于数组中,返回它将会被按顺序插入的位置. 你可以假设数组中无重复元素. 示例 1: 输入: [1,3,5,6], 5 输 ...

  5. PHY Linux 驱动

    以太网 MAC(链路层)+PHY(物理层/RTL8201F,88E1111);集成型DM9000,RTL8139CP 由于网络数据传输量较大,不论是分开型还是集成型,通常会在MAC和PHY之间引入DM ...

  6. 【转载】如何解决failed to push some refs to git

    在使用git 对源代码进行push到gitHub时可能会出错,信息如下   此时很多人会尝试下面的命令把当前分支代码上传到master分支上. $ git push -u origin master ...

  7. WebHeaderCollection类

    .net添加http报头 string[] allKeys = WebHeaderCollection.AllKeys; for (int i = 0; i < allKeys.Length; ...

  8. 使AJAX可缓存——基于flask

    主流浏览器都有缓存机制,主要基于HTTP协议定义的缓存策略.对于一定时间内不发生变动的文档缓存起来,对于下次请求,就可以直接返回缓存的结果.使用缓存有以下好处: 1.减少冗余的数据传输,节省网络流量成 ...

  9. MySQL 作业题及答案

    MySQL 测试题 一. 表关系: 请创建如下表,并创建相关约束 创建表sql如下: /* Navicat MySQL Data Transfer Source Server : 192.168.11 ...

  10. python爬取网易云音乐歌单音乐

    在网易云音乐中第一页歌单的url:http://music.163.com/#/discover/playlist/ 依次第二页:http://music.163.com/#/discover/pla ...