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 ORM框架SQLAlchemy学习笔记之数据查询实例
Jun 10 Python
python判断字符串是否包含子字符串的方法
Mar 24 Python
node.js获取参数的常用方法(总结)
May 29 Python
Python实现合并同一个文件夹下所有txt文件的方法示例
Apr 26 Python
BP神经网络原理及Python实现代码
Dec 18 Python
python爬取cnvd漏洞库信息的实例
Feb 14 Python
Django 表单模型选择框如何使用分组
May 16 Python
深入浅析python3中的unicode和bytes问题
Jul 03 Python
Python使用正则表达式分割字符串的实现方法
Jul 16 Python
解决python tkinter界面卡死的问题
Jul 17 Python
python正则-re的用法详解
Jul 28 Python
Pandas实现DataFrame按行求百分数(比例数)
Dec 27 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中去除换行解决办法小结(PHP_EOL)
2011/11/27 PHP
php调用Google translate_tts api实现代码
2013/08/07 PHP
为PHP安装imagick时出现Cannot locate header file MagickWand.h错误的解决方法
2014/11/03 PHP
PHP支付系统设计与典型案例分享
2016/08/02 PHP
JQuery 动态扩展对象之另类视角
2010/05/25 Javascript
javascript返回顶部效果(自写代码)
2013/01/06 Javascript
教你用jquery实现iframe自适应高度
2014/06/11 Javascript
jQuery中:radio选择器用法实例
2015/01/03 Javascript
在浏览器中打开或关闭JavaScript的方法
2015/06/03 Javascript
jQuery 选择同时包含两个class的元素的实现方法
2016/06/01 Javascript
BOM系列第一篇之定时器setTimeout和setInterval
2016/08/17 Javascript
Move.js入门
2017/02/08 Javascript
关于不同页面之间实现参数传递的几种方式讨论
2017/02/13 Javascript
JS获取填报扩展单元格控件的值的解决办法
2017/07/14 Javascript
AngularJS实现的省市二级联动功能示例【可对选项实现增删】
2017/10/26 Javascript
微信小程序实现折叠展开效果
2018/07/19 Javascript
js实现打字小游戏
2019/12/17 Javascript
VUE : vue-cli中去掉路由中的井号#操作
2020/09/04 Javascript
[00:12]2018DOTA2亚洲邀请赛 sylar表现SOLO技艺
2018/04/06 DOTA
在Django的URLconf中进行函数导入的方法
2015/07/18 Python
python贪婪匹配以及多行匹配的实例讲解
2018/04/19 Python
Python实现获取邮箱内容并解析的方法示例
2018/06/16 Python
如何利用Pyecharts可视化微信好友
2019/07/04 Python
简单了解python的内存管理机制
2019/07/08 Python
python 创建一维的0向量实例
2019/12/02 Python
如何利用Python matplotlib绘制雷达图
2020/12/21 Python
css3 自定义字体font-face使用介绍
2014/05/14 HTML / CSS
公务员年总结的自我评价
2013/10/25 职场文书
捐助倡议书范文
2014/04/15 职场文书
中班教师个人总结
2015/02/05 职场文书
餐厅收银员岗位职责
2015/04/07 职场文书
离婚起诉书范本
2015/05/18 职场文书
堂吉诃德读书笔记
2015/06/30 职场文书
彻底理解golang中什么是nil
2021/04/29 Golang
原生JS实现飞机大战小游戏
2021/06/09 Javascript
Python面向对象编程之类的概念
2021/11/01 Python