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

作者:hnr1017 时间:2023-07-30 20:08:15 

本文实例讲述了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程序设计有所帮助。

来源:https://blog.51cto.com/hnr520/1880663

标签:python,nginx日志
0
投稿

猜你喜欢

  • 用python查找统一局域网下ip对应的mac地址

    2023-01-23 19:10:21
  • MySQL实例讲解子查询的使用

    2024-01-17 05:38:27
  • C++调用python(执行py文件)的全过程

    2022-04-24 00:30:53
  • python-yml文件读写与xml文件读写

    2022-06-16 06:43:50
  • PHP 图片上传代码

    2024-05-22 10:05:49
  • 基于Python制作AI聊天软件的示例代码

    2023-09-27 14:58:25
  • SQL Server配置管理器无法连接到WMI提供程序

    2024-01-23 23:49:30
  • 动态给表添加删除字段并同时修改它的插入更新存储过程

    2011-12-01 10:18:28
  • Keras:Unet网络实现多类语义分割方式

    2022-02-26 16:36:49
  • python实现在cmd窗口显示彩色文字

    2023-03-23 22:49:01
  • asp中提示至少一个参数没有被指定值 解决方法

    2013-06-01 20:14:00
  • javascript在myeclipse中报错的解决方法

    2024-04-22 22:41:55
  • JS严格模式知识点总结

    2024-05-13 10:06:42
  • JS实现点击下拉菜单把选择的内容同步到input输入框内的实例

    2023-09-08 19:50:10
  • Go语言编译原理之变量捕获

    2024-04-27 15:27:14
  • js实现微信聊天效果

    2024-04-16 09:14:33
  • 浅谈pandas dataframe对除数是零的处理

    2023-03-26 10:35:30
  • ASP中模拟PHP的关联数组

    2009-12-25 16:31:00
  • vue实现excel表格的导入导出的示例

    2024-05-10 14:10:22
  • 一文详解golang通过io包进行文件读写

    2024-05-09 10:07:52
  • asp之家 网络编程 m.aspxhome.com