千家信息网

基于python怎么实现cdn日志文件导入mysql进行分析

发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,本篇内容主要讲解"基于python怎么实现cdn日志文件导入mysql进行分析",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"基于python怎么实现cdn
千家信息网最后更新 2025年11月07日基于python怎么实现cdn日志文件导入mysql进行分析

本篇内容主要讲解"基于python怎么实现cdn日志文件导入mysql进行分析",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"基于python怎么实现cdn日志文件导入mysql进行分析"吧!

一、本文需求背景

周六日出现CDN大量请求,现需要分析其请求频次与来源,查询是否存在被攻击问题。

本文以阿里云CDN日志作为辅助查询数据,其它云平台大同小异。

系统提供的离线日志如下所示:

二、需求落地如下

日志实例如下所示:

[9/Jun/2015:01:58:09 +0800] 10.10.10.10 - 1542 "-" "GET http://www.aliyun.com/index.html" 200 191 2830 MISS "Mozilla/5.0 (compatible; AhrefsBot/5.0; +http://example.com/robot/)" "text/html"

其中相关字段的解释如下:

  • [9/Jun/2015:01:58:09 +0800]:日志开始时间。

  • 10.10.10.10:访问IP。

  • -:代理IP。

  • 1542:请求响应时间,单位为毫秒。

  • "-": HTTP请求头中的Referer。

  • GET:请求方法。

  • http://www.aliyun.com/index.html:用户请求的URL链接。

  • 200:HTTP状态码。

  • 191:请求大小,单位为字节。

  • 2830:请求返回大小,单位为字节。

  • MISS:命中信息。

    • HIT:用户请求命中了CDN边缘节点上的资源(不需要回源)。

    • MISS:用户请求的内容没有在CDN边缘节点上缓存,需要向上游获取资源(上游可能是CDN L2节点,也可能是源站)。

  • Mozilla/5.0(compatible; AhrefsBot/5.0; +http://example.com/robot/):User-Agent请求头信息。

  • text/html:文件类型。

按照上述字段说明创建一个 MySQL 表,用于后续通过 Python 导入 MySQL 数据,字段可以任意定义

SET NAMES utf8mb4;SET FOREIGN_KEY_CHECKS = 0;-- ------------------------------ Table structure for ll-- ----------------------------DROP TABLE IF EXISTS `ll`;CREATE TABLE `ll`  (  `id` int(11) NOT NULL,  `s_time` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,  `ip` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,  `pro_ip` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,  `dura_time` int(11) NULL DEFAULT NULL,  `referer` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,  `method` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,  `url` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,  `code` int(255) NULL DEFAULT NULL,  `size` double NULL DEFAULT NULL,  `res_size` double NULL DEFAULT NULL,  `miss` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,  `ua` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,  `html_type` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,  PRIMARY KEY (`id`) USING BTREE) ENGINE = MyISAM CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;SET FOREIGN_KEY_CHECKS = 1;

下载全部日志之后,使用 Python 批量导入数据库中,解析代码如下,在提前开始前需要先看一下待提取的每行数据内容。

[11/Mar/2022:00:34:17 +0800] 118.181.139.215 - 1961 "http://xx.baidu.cn/" "GET https://cdn.baidu.com/video/1111111111.mp4" 206 66 3739981 HIT "Mozilla/5.0 (iPad; CPU OS 15_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 SP-engine/2.43.0 main%2F1.0 baiduboxapp/13.5.0.10 (Baidu; P2 15.1) NABar/1.0" "video/mp4"

初看之下,我们会使用空格进行切片,例如下述代码:

import os# 获取文件名my_path = r"C:日志目录"file_names = os.listdir(my_path)file_list = [os.path.join(my_path, file) for file in file_names]for file in file_list:    with open(file, 'r', encoding='utf-8') as f:        lines = f.readlines()        for i in lines:            item_list = i.split(' ')            s_time = item_list[0]+' '+item_list[1]            ip = item_list[2],            pro_ip =item_list[3],            dura_time =item_list[4],            referer =item_list[5],            method =item_list[6],            url = item_list[7],            code =item_list[8],            size =item_list[9],            res_size =item_list[10],            miss =item_list[11],            html_type =item_list[12]            print(s_time,ip,pro_ip,dura_time,referer,method,url,code,size,res_size,miss,html_type)

运行之后,会发现里面的开始时间位置,UA位置都存在空格,所以该方案舍弃,接下来使用正则表达式提取。

参考待提取的模板编写正则表达式如下所示:

\[(?

接下来进行循环读取数据,然后进行提取:

import osimport reimport pymysql# 获取文件名my_path = r"C:日志文件夹"file_names = os.listdir(my_path)file_list = [os.path.join(my_path, file) for file in file_names]wait_list = []for file in file_list:    with open(file, 'r', encoding='utf-8') as f:        lines = f.readlines()        for i in lines:            pattern = re.compile(                '\[(?P

读取到数据存储到 wait_list 列表中,然后操作列表,写入MySQL,该操作为了防止SQL语句过长,所以每次间隔1000元素进行插入。

def insert_data():    for i in range(0,int(len(wait_list)/1000+1)):        items = wait_list[i * 1000:i * 1000 + 1000]        item_str = ",".join(items)        inser_sql = f"INSERT INTO ll(s_time, ip, pro_ip, dura_time, referer, method, url,code, size, res_size, miss, ua,html_type) VALUES {item_str}"        db = pymysql.connect(host='localhost',                             user='root',                             password='root',                             database='logs')        cursor = db.cursor()        try:            cursor.execute(inser_sql)            db.commit()        except Exception as e:            # print(content)            print(e)            db.rollback()

最终的结果如下所示:

导入MySQL之后,就可以按照自己的需求进行排序与查询了。

三、自定义查询

可以通过 refer 计算请求次数:

select count(id) num,referer from ll GROUP BY referer ORDER BY num desc

到此,相信大家对"基于python怎么实现cdn日志文件导入mysql进行分析"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

日志 文件 数据 查询 分析 内容 单位 字段 时间 用户 节点 需求 接下来 代码 位置 信息 大小 字节 文件名 方法 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 权限系统的数据库设计 软件开发考研有什么科目 深圳松之峰网络技术有限公司 搞软件开发能和大数据接轨吗 湖南服务器电源专卖店 solr从数据库导入数据 java数据库开发培训 软件开发选pro还是air 企业服务器有多大储存 数据库两张表的主键是否可以相同 中专计算机网络技术教课视频 白夜极光国际服怎么选服务器 防范和化解网络安全风险的策略 数据库体系结构从上至下 文献数据库有那些基本类型 网络安全保险让企业吃上定心丸 软件开发行为模式 网鼎杯网络安全大赛规则 5g网络技术难点是什么 白盾网络安全 奉贤区创新数据库活动简介 热血传奇新服务器怎么玩 数据库大对象文本字段 临汾市农业局网络安全培训 网络技术应用发展规划 数据库source word中怎么生成数据库 怀宁网络技术及信息安全工程师 五莲软件开发教学平台哪个好 软件开发中sr指什么
0