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的设计模式编程入门指南
Apr 02 Python
python同时给两个收件人发送邮件的方法
Apr 30 Python
彻底搞懂Python字符编码
Jan 23 Python
python+pandas生成指定日期和重采样的方法
Apr 11 Python
python 高效去重复 支持GB级别大文件的示例代码
Nov 08 Python
Python操作mongodb数据库的方法详解
Dec 08 Python
Python 实现中值滤波、均值滤波的方法
Jan 09 Python
Python中new方法的详解
Jan 15 Python
python定时复制远程文件夹中所有文件
Apr 30 Python
Python企业编码生成系统之系统主要函数设计详解
Jul 26 Python
pytorch torch.expand和torch.repeat的区别详解
Nov 05 Python
使用keras时input_shape的维度表示问题说明
Jun 29 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(3)
2006/10/09 PHP
php预定义常量
2006/12/25 PHP
学习discuz php 引入文件的方法DISCUZ_ROOT
2009/06/21 PHP
php进行支付宝开发中return_url和notify_url的区别分析
2014/12/22 PHP
PHP输出九九乘法表代码实例
2015/03/27 PHP
PHP中抽象类、接口的区别与选择分析
2016/03/29 PHP
使用PHP开发留言板功能
2019/11/19 PHP
js判断变量是否空值的代码
2008/10/26 Javascript
实现png图片和png背景透明(支持多浏览器)的方法
2009/09/08 Javascript
google jQuery 引用文件,jQuery 引用地址集合(jquery 1.2.6至jquery1.5.2)
2011/04/24 Javascript
给jqGrid数据行添加修改和删除操作链接(之一)
2011/11/04 Javascript
js实现防止被iframe的方法
2015/07/03 Javascript
全面解析JavaScript里的循环方法之forEach,for-in,for-of
2020/04/20 Javascript
jQuery封装的屏幕居中提示信息代码
2016/06/08 Javascript
任意Json转成无序列表的方法示例
2016/12/09 Javascript
AngularJS的脏检查深入分析
2017/04/22 Javascript
AngulaJS路由 ui-router 传参实例
2017/04/28 Javascript
Redux 和 Mobx的选择问题:让你不再困惑!
2017/09/18 Javascript
详解ES6之async+await 同步/异步方案
2017/09/19 Javascript
vue :src 文件路径错误问题的解决方法
2018/05/15 Javascript
vue + webpack如何绕过QQ音乐接口对host的验证详解
2018/07/01 Javascript
angular inputNumber指令输入框只能输入数字的实现
2019/12/03 Javascript
OpenLayers实现图层切换控件
2020/09/25 Javascript
vue实现顶部菜单栏
2020/11/08 Javascript
Python3 正在毁灭 Python的原因分析
2014/11/28 Python
用Python计算三角函数之atan()方法的使用
2015/05/15 Python
python比较两个列表大小的方法
2015/07/11 Python
python__new__内置静态方法使用解析
2020/01/07 Python
Python通过VGG16模型实现图像风格转换操作详解
2020/01/16 Python
css3实现背景模糊的三种方式(小结)
2020/05/15 HTML / CSS
html5贪吃蛇游戏使用63行代码完美实现
2013/06/25 HTML / CSS
优秀经理事迹材料
2014/02/01 职场文书
高中生物教学反思
2014/02/05 职场文书
学校招生宣传广告词
2014/03/19 职场文书
2014年国庆节演讲稿
2014/09/19 职场文书
Anaconda安装pytorch和paddle的方法步骤
2022/04/03 Python