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 相关文章推荐
在Linux下调试Python代码的各种方法
Apr 17 Python
Python编程实现双击更新所有已安装python模块的方法
Jun 05 Python
Python使用xlwt模块操作Excel的方法详解
Mar 27 Python
Python实现获取nginx服务器ip及流量统计信息功能示例
May 18 Python
python之文件读取一行一行的方法
Jul 12 Python
对PyQt5中的菜单栏和工具栏实例详解
Jun 20 Python
Python 的字典(Dict)是如何存储的
Jul 05 Python
微信小程序python用户认证的实现
Jul 29 Python
通过字符串导入 Python 模块的方法详解
Oct 27 Python
numpy.transpose()实现数组的转置例子
Dec 02 Python
matplotlib 对坐标的控制,加图例注释的操作
Apr 17 Python
Python自动化办公Excel模块openpyxl原理及用法解析
Nov 05 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
PHP中把对象数组转换成普通数组的方法
2015/07/10 PHP
PHP使用FFmpeg获取视频播放总时长与码率等信息
2016/09/13 PHP
JavaScript 5 新增 Array 方法实现介绍
2012/02/06 Javascript
jquery ajax修改全局变量示例代码
2013/11/08 Javascript
深入理解JavaScript系列(21):S.O.L.I.D五大原则之接口隔离原则ISP详解
2015/03/05 Javascript
JavaScript中利用Array和Object实现Map的方法
2015/07/27 Javascript
Bootstrap每天必学之基础排版
2015/11/20 Javascript
浅谈js内置对象Math的属性和方法(推荐)
2016/09/19 Javascript
Bootstrap CSS布局之代码
2016/12/17 Javascript
jQuery Layer弹出层传值到父页面的实现代码
2017/08/17 jQuery
JS实现闭包中的沙箱模式示例
2017/09/07 Javascript
react-native-fs实现文件下载、文本存储的示例代码
2017/09/22 Javascript
完美解决通过IP地址访问VUE项目的问题
2020/07/18 Javascript
Vue 简单实现前端权限控制的示例
2020/12/25 Vue.js
[03:42]2014DOTA2国际邀请赛 第三日比赛排位扑朔迷离
2014/07/12 DOTA
python使用自定义user-agent抓取网页的方法
2015/04/15 Python
详解配置Django的Celery异步之路踩坑
2018/11/25 Python
Python3多线程基础知识点
2019/02/19 Python
python3 批量获取对应端口服务的实例
2019/07/25 Python
HTML的form表单和django的form表单
2019/07/25 Python
扩展Django admin的list_filter()可使用范围方法
2019/08/21 Python
Python实现捕获异常发生的文件和具体行数
2020/04/25 Python
新加坡最受追捧的体验平台:Hapz
2018/01/01 全球购物
中国汽车租赁行业头部企业:一嗨租车
2019/05/16 全球购物
都柏林通行卡/城市通票:The Dublin Pass
2020/02/16 全球购物
Expedia瑞典官网:预订度假屋、酒店、汽车租赁、机票等
2021/01/23 全球购物
J2EE系统只能是基于web
2015/09/08 面试题
中专生毕业个人鉴定
2014/02/26 职场文书
行政内勤岗位职责
2014/04/07 职场文书
主题党日活动总结
2014/07/08 职场文书
教师纪念9.18事件演讲稿范文
2014/09/14 职场文书
2014年党建工作汇报材料
2014/10/27 职场文书
办公室个人总结
2015/02/28 职场文书
美甲店的创业计划书模板
2019/08/23 职场文书
曾国藩励志经典名言37句,蕴含哲理
2019/10/14 职场文书
详细聊一聊mysql的树形结构存储以及查询
2022/04/05 MySQL