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制作钉钉加密/解密工具
Dec 07 Python
python使用xlrd与xlwt对excel的读写和格式设定
Jan 21 Python
python中Pycharm 输出中文或打印中文乱码现象的解决办法
Jun 16 Python
使用 Visual Studio Code(VSCode)搭建简单的Python+Django开发环境的方法步骤
Dec 17 Python
Python Pexpect库的简单使用方法
Jan 29 Python
解决pycharm 工具栏Tool中找不到Run manager.py Task的问题
Jul 01 Python
Python笔记之工厂模式
Nov 20 Python
python 实现矩阵按对角线打印
Nov 29 Python
Pandas实现dataframe和np.array的相互转换
Nov 30 Python
python飞机大战 pygame游戏创建快速入门详解
Dec 17 Python
python第三方库学习笔记
Feb 07 Python
python模块内置属性概念及实例
Feb 18 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/12/24 PHP
prototype1.4中文手册
2006/09/22 Javascript
jquery复选框CHECKBOX全选、反选
2008/08/30 Javascript
JS Jquery 遍历,筛选页面元素 自动完成(实现代码)
2013/07/08 Javascript
纯javascript实现自动发送邮件
2015/10/21 Javascript
js仿微博实现统计字符和本地存储功能
2015/12/22 Javascript
AngularJS中使用HTML5手机摄像头拍照
2016/02/22 Javascript
强大Vue.js组件浅析
2016/09/12 Javascript
关于JS中二维数组的声明方法
2016/09/24 Javascript
表单input项使用label同时引用Bootstrap库导致input点击效果区增大问题
2016/10/11 Javascript
js中数组的常用方法小结
2016/12/30 Javascript
bootstrap table实现点击翻页功能 可记录上下页选中的行
2017/09/28 Javascript
详解操作虚拟dom模拟react视图渲染
2018/07/25 Javascript
解决webpack dev-server不能匹配post请求的问题
2018/08/24 Javascript
Nodejs Express 通过log4js写日志到Logstash(ELK)
2018/08/30 NodeJs
vue动态绑定class的几种常用方式小结
2019/05/21 Javascript
深入了解JavaScript 私有化
2019/05/30 Javascript
[01:06]DOTA2小知识课堂 Ep.02 吹风竟可解梦境缠绕
2019/12/05 DOTA
python进阶教程之函数参数的多种传递方法
2014/08/30 Python
详解python并发获取snmp信息及性能测试
2017/03/27 Python
python对配置文件.ini进行增删改查操作的方法示例
2017/07/28 Python
Python3 操作符重载方法示例
2017/11/23 Python
mvc框架打造笔记之wsgi协议的优缺点以及接口实现
2018/08/01 Python
Django 路由控制的实现代码
2018/11/08 Python
python中struct模块之字节型数据的处理方法
2019/08/27 Python
Python函数中的可变长参数详解
2019/09/12 Python
Python识别处理照片中的条形码
2020/11/16 Python
h5使用canvas画布实现手势解锁
2019/01/04 HTML / CSS
秘鲁购物网站:Linio秘鲁
2017/04/07 全球购物
Python的两道面试题
2013/06/29 面试题
教师工作自我鉴定范文
2014/09/14 职场文书
2014年化妆品销售工作总结
2014/12/01 职场文书
2015年高校图书馆工作总结
2015/04/30 职场文书
青涩记忆观后感
2015/06/18 职场文书
Nginx安装完成没有生成sbin目录的解决方法
2021/03/31 Servers
Golang 空map和未初始化map的注意事项说明
2021/04/29 Golang