python解析Nginx访问日志
环境说明
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访问日志的更多相关文章
- python统计apache、nginx访问日志IP访问次数并且排序(显示前20条)【转】
前言:python统计apache.nginx访问日志IP访问次数并且排序(显示前20条).其实用awk+sort等命令可以实现,用awk数组也可以实现,这里只是用python尝试下. apach ...
- 一、基于hadoop的nginx访问日志分析---解析日志篇
前一阵子,搭建了ELK日志分析平台,用着挺爽的,再也不用给开发拉各种日志,节省了很多时间. 这篇博文是介绍用python代码实现日志分析的,用MRJob实现hadoop上的mapreduce,可以直接 ...
- Python正则表达式,统计分析nginx访问日志
目标: 1.正则表达式 2.oop编程,统计nginx访问日志中不同IP地址出现的次数并排序 1.正则表达式 #!/usr/bin/env python # -*- coding: utf-8 -*- ...
- 使用python找出nginx访问日志中访问次数最多的10个ip排序生成网页
使用python找出nginx访问日志中访问次数最多的10个ip排序生成网页 方法1:linux下使用awk命令 # cat access1.log | awk '{print $1" &q ...
- 按日期切割nginx访问日志--及性能优化
先谈下我们需求,一个比较大的nginx访问日志,根据访问日期切割日志,保存在/tmp目录下. 测试机器为腾讯云机子,单核1G内存.测试日志大小80M. 不使用多线程版: #!/usr/bin/env ...
- 采集并分析Nginx访问日志
日志服务支持通过数据接入向导配置采集Nginx日志,并自动创建索引和Nginx日志仪表盘,帮助您快速采集并分析Nginx日志. 许多个人站长选取了Nginx作为服务器搭建网站,在对网站访问情况进行分析 ...
- Logstash+ElasticSearch+Kibana处理nginx访问日志(转)
ELK似乎是当前最为流行的日志收集-存储-分析的全套解决方案. 去年年初, 公司里已经在用, 当时自己还山寨了一个统计系统(postgresql-echarts, 日志无结构化, json形式存储到p ...
- nginx访问日志分析,筛选时间大于1秒的请求
处理nginx访问日志,筛选时间大于1秒的请求 #!/usr/bin/env python ''' 处理访问日志,筛选时间大于1秒的请求 ''' with open('test.log','a+' ...
- Nginx 访问日志轮询切割
Nginx 访问日志轮询切割脚本 #!/bin/sh Dateformat=`date +%Y%m%d` Basedir="/application/nginx" Nginxlog ...
随机推荐
- spring boot 2.0.3+spring cloud (Finchley)5、路由网关Spring Cloud Zuul
Zuul作为微服务系统的网关组件,用于构建边界服务,致力于动态路由.过滤.监控.弹性伸缩和安全. 为什么需要Zuul Zuul.Ribbon以及Eureka结合可以实现智能路由和负载均衡的功能:网关将 ...
- Packet Tracer 5.0 构建CCNA实验(3)—— 路由器实现vlan间通信
--交换机配置 --交换机和路由器连接的接口 switchport mode trunk --路由器配置 enable conf t int fa0/0.1 --路由器接口的子接口 encapsula ...
- 重构改善既有代码设计--重构手法14:Hide Delegate (隐藏委托关系)
客户通过一个委托类来调用另一个对象.在服务类上建立客户所需的所有函数,用以隐藏委托关系. 动机:封装即使不是对象的最关机特性,也是最关机特性之一.“封装”意味着每个对象都应该少了解系统的其他部分.如此 ...
- 重构改善既有代码设计--重构手法02:Inline Method (内联函数)& 03: Inline Temp(内联临时变量)
Inline Method (内联函数) 一个函数调用的本体与名称同样清楚易懂.在函数调用点插入函数体,然后移除该函数. int GetRating() { return MoreThanfiveLa ...
- Intellij IDEA 快捷键整理(转)
Ctrl+Shift + Enter,语句完成 “!”,否定完成,输入表达式时按 “!”键 Ctrl+E,最近的文件 Ctrl+Shift+E,最近更改的文件 Shift+Click,可以关闭文件 C ...
- NYOJ 257 郁闷的C小加(一) (字符串处理)
题目链接 描述 我们熟悉的表达式如a+b.a+b(c+d)等都属于中缀表达式.中缀表达式就是(对于双目运算符来说)操作符在两个操作数中间:num1 operand num2.同理,后缀表达式就是操作符 ...
- Django之Form组件验证
今天来谈谈Django的Form组件操作 Django中的Form一般有两种功能: ·输入html ·验证用户输入 Form验证流程 ·定义规则(是一个类) ·前端把数据提交过来 ·匹配规则 · ...
- Python ctypes中cast/py_object用法
class ctypes.py_object Represents the C PyObject * datatype. Calling this without an argument create ...
- http 之cookie和session
cookie和session 关于http: 1.http是:无状态.短连接 2.http的请求生命周期:给服务端发送一个请起头,通过域名提取url,通过路由关系匹配,再通过函数+html进行模板加 ...
- SPI最大传输速率【转】
转自:https://www.silabs.com/community/mcu/8-bit/knowledge-base.entry.html/2017/01/13/spi_-asc0 问题 SPI作 ...