python实现的分析并统计nginx日志数据功能示例


Posted in Python onDecember 21, 2019

本文实例讲述了python实现的分析并统计nginx日志数据功能。分享给大家供大家参考,具体如下:

利用python脚本分析nginx日志内容,默认统计ip、访问url、状态,可以通过修改脚本统计分析其他字段。

一、脚本运行方式

python count_log.py -f med.xxxx.com.access.log

二、脚本内容

#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
1.分析日志,每行日志按空格切分,取出需要统计的相应字段,作为字典的key,遍历相加
2.使用到字典的get方法,通过定义默认值,避免miss key的错误
3.使用列表解析表达式
4.使用sorted函数排序列表
5.使用argparse传入参数
6.nginx日志格式:
log_format     access_log
  '$remote_addr - $remote_user [$time_local] $request '
  '"$status" $body_bytes_sent "$http_referer" '
  '"$http_user_agent" "$request_time"' '"$upstream_addr"' '"$upstream_response_time"';
7.日志内容:
222.xx.xxx.15 - - [07/Dec/2016:00:03:27 +0800] GET /app/xxx/xxx.apk HTTP/1.0 "304" 0 "-" "Mozilla/5.0 Gecko/20100115 Firefox/3.6" "0.055""-""-"
8.脚本运行结果:
('106.xx.xx.46', '/gateway/xxx/user/mxxxxx/submitSelfTestOfSingleQuestion', '"200"', 299)
('182.1xx.xx.83', '/', '"200"', 185)
('222.xx.1xx.15', '/', '"200"', 152)
('125.xx.2xx.58', '/', '"200"', 145)
"""
import argparse
def count_log(filename, num):
  try:
    with open(filename) as f:
      dic = {}
      for l in f:
        if not l == '\n': # 判断空白行
          arr = l.split(' ')
          ip = arr[0]
          url = arr[6]
          status = arr[8]
          # 字典的key是有多个元素构成的元组
          # 字典的get方法,对取的key的值加1,第一次循环时由于字典为空指定的key不存在返回默认值0,因此读第一行日志时,统计结果为1
          dic[(ip, url, status)] = dic.get((ip, url, status), 0) + 1
    # 从字典中取出key和value,存在列表中,由于字典的key比较特殊是有多个元素构成的元组,通过索引k[#]的方式取出key的每个元素
    dic_list = [(k[0], k[1], k[2], v) for k, v in dic.items()]
    for k in sorted(dic_list, key=lambda x: x[3], reverse=True)[:num]:
      print(k)
  except Exception as e:
    print("open file error:", e)
if __name__ == '__main__':
  parser = argparse.ArgumentParser(description="传入日志文件")
  # 定义必须传入日志文件,使用格式-f filename
  parser.add_argument('-f', action='store', dest='filename', required=True)
  # 通过-n传入数值,取出最多的几行,默认取出前10
  parser.add_argument('-n', action='store', dest='num', type=int, required=False, default=10)
  given_args = parser.parse_args()
  filename = given_args.filename
  num = given_args.num
  count_log(filename, num)

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
跟老齐学Python之变量和参数
Oct 10 Python
python使用post提交数据到远程url的方法
Apr 29 Python
python getopt详解及简单实例
Dec 30 Python
Python 一句话生成字母表的方法
Jan 02 Python
Python理解递归的方法总结
Jan 28 Python
python程序变成软件的实操方法
Jun 24 Python
在Python中获取操作系统的进程信息
Aug 27 Python
关于sys.stdout和print的区别详解
Dec 05 Python
解决Numpy中sum函数求和结果维度的问题
Dec 06 Python
linux centos 7.x 安装 python3.x 替换 python2.x的过程解析
Dec 14 Python
golang中的空接口使用详解
Mar 30 Python
python编程项目中线上问题排查与解决
Nov 01 Python
Python数据持久化存储实现方法分析
Dec 21 #Python
python cv2截取不规则区域图片实例
Dec 21 #Python
Python lxml模块的基本使用方法分析
Dec 21 #Python
python Manager 之dict KeyError问题的解决
Dec 21 #Python
tornado+celery的简单使用详解
Dec 21 #Python
Python selenium的基本使用方法分析
Dec 21 #Python
Flask框架搭建虚拟环境的步骤分析
Dec 21 #Python
You might like
一个高ai的分页函数和一个url函数
2006/10/09 PHP
PHP调用MySQL的存储过程的实现代码
2008/08/12 PHP
php 信息采集程序代码
2009/03/17 PHP
PHP模拟post提交数据方法汇总
2016/02/16 PHP
gearman中worker常驻后台,导致MySQL server has gone away的解决方法
2020/02/27 PHP
CL vs ForZe BO5 第二场 2.13
2021/03/10 DOTA
jQuery的控件及事件(输入控件及回车事件)使用示例
2013/07/25 Javascript
js鼠标点击图片切换效果实现代码
2015/11/19 Javascript
jQuery鼠标悬浮链接弹出跟随图片实例代码
2016/01/08 Javascript
详解javascript跨浏览器事件处理程序
2016/03/27 Javascript
js前端实现多图图片上传预览的两个方法(推荐)
2016/11/18 Javascript
Bootstrap轮播图的使用和理解4
2016/12/14 Javascript
BootStrap实现鼠标悬停下拉列表功能
2017/02/17 Javascript
微信小程序 生命周期函数详解
2017/05/24 Javascript
JavaScript Drum Kit 指南(纯 JS 模拟敲鼓效果)
2017/07/23 Javascript
浅谈vue项目重构技术要点和总结
2018/01/23 Javascript
深入浅析Vue中的slots/scoped slots
2018/04/03 Javascript
在vue中获取微信支付code及code被占用问题的解决方法
2019/04/16 Javascript
vue ssr+koa2构建服务端渲染的示例代码
2020/03/23 Javascript
JavaScript Date对象功能与用法学习记录
2020/04/28 Javascript
通过angular CDK实现页面元素拖放的步骤详解
2020/07/01 Javascript
javascript局部自定义鼠标右键菜单
2020/12/08 Javascript
[03:11]DOTA2上海特锦赛小组赛第一日recap精彩回顾
2016/02/28 DOTA
Python 面向对象 成员的访问约束
2008/12/23 Python
Python聚类算法之基本K均值实例详解
2015/11/20 Python
python批量读取txt文件为DataFrame的方法
2018/04/03 Python
Python实现调用另一个路径下py文件中的函数方法总结
2018/06/07 Python
Python使用Pickle模块进行数据保存和读取的讲解
2019/04/09 Python
Vans澳大利亚官网:购买鞋子、服装及配件
2019/09/05 全球购物
serialVersionUID具有什么样的特征
2014/02/20 面试题
保险公司晨会主持词
2014/03/22 职场文书
小学生国庆演讲稿
2014/09/05 职场文书
golang 实现并发求和
2021/05/08 Golang
python 使用Tensorflow训练BP神经网络实现鸢尾花分类
2021/05/12 Python
使用nginx配置访问wgcloud的方法
2021/06/26 Servers
聊聊redis-dump工具安装问题
2022/01/18 Redis