本文需求背景

周六日出现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位置都存在空格,所以该方案舍弃,接下来使用正则表达式提取。
参考待提取的模板编写正则表达式如下所示

\[(?<time>.*?)\] (?<ip>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) (?<pro_ip>.*?) (?<dura_time>\d+) \"(?<referer>.*?)\" \"(?<method>.*?) (?<url>.*?)\" (?<code>\d+) (?<size>\d+) (?<res_size>\d+) (?<miss>.*?) \"(?<ua>.*?)\" \"(?<html_type>.*?)\"

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

import os
import re
import 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<time>.*?)\] (?P<ip>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) (?P<pro_ip>.*?) (?P<dura_time>\d+) \"(?P<referer>.*?)\" \"(?P<method>.*?) (?P<url>.*?)\" (?P<code>\d+) (?P<size>\d+) (?P<res_size>\d+) (?P<miss>.*?) \"(?P<ua>.*?)\" \"(?P<html_type>.*?)\"')gs = pattern.findall(i)item_list = gs[0]s_time = item_list[0]ip = item_list[1]pro_ip = item_list[2]dura_time = item_list[3]referer = item_list[4]method = item_list[5]url = item_list[6]code = item_list[7]size = item_list[8]res_size = item_list[9]miss = item_list[10]ua = item_list[11]html_type = item_list[12]values_str = f"('{s_time}', '{ip}', '{pro_ip}', {int(dura_time)}, '{referer}', '{method}', '{url}', {int(code)}, {int(size)}, {int(res_size)}, '{miss}', '{ua}','{html_type}')"wait_list.append(values_str)

读取到数据存储到 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

记录时间

2022年度 Flag,写作的 585 / 1024 篇。
可以关注我,点赞我、评论我、收藏我啦。

更多精彩

  • Python 爬虫 100 例教程导航帖(连续 3 年,不断更!)
  • Python爬虫120 (39.9 元,保 5 年更新)

cdn日志文件导入mysql进行分析,核心用到 Python相关推荐

  1. gff3转mysql_科学网-把GFF3文件导入MySQL数据库-闫双勇的博文

    什么是GFF3?这个一种序列注释文件的格式,基因组注释数据常常会用这种格式来记录序列注释信息,关于这种格式的更多信息,可以在这里学习:http://www.sequenceontology.org/g ...

  2. 收藏!用Python一键批量将任意结构的CSV文件导入MySQL数据库。

    Python有很多库可以对CSV文件和Excel文件进行自动化和规模化处理.但是,使用数据库可以将计算机完成任务的能力提升成千上万倍! 那么问题来了,如果有很多个文件需要导入数据库,一个一个操作效率太 ...

  3. gff3转mysql_科学网—把GFF3文件导入MySQL数据库 - 闫双勇的博文

    什么是GFF3?这个一种序列注释文件的格式,基因组注释数据常常会用这种格式来记录序列注释信息,关于这种格式的更多信息,可以在这里学习:http://www.sequenceontology.org/g ...

  4. excel 导入mysql_如何将Excel文件导入MySQL数据库

    本文实例为大家分享了Excel文件导入MySQL数据库的方法,供大家参考,具体内容如下 1.简介 本博客给大家分享一个实用的小技能,我们在使用数据库时常常需要将所需的Excel数据添加进去,如果按照传 ...

  5. navicat 导入csv未响应_使用navicat将csv文件导入mysql

    本文为大家分享了使用navicat将csv文件导入mysql的具体代码,供大家参考,具体内容如下 1.打开navicat,连接到数据库并找到自己想要导入数据的表.数据库表在指定数据库下的表下. 2.右 ...

  6. excel数据库_将excel文件导入mysql数据库教程(PHP实现)

    点击蓝字关注我们!每天获取最新的编程小知识! 源 / php中文网      源 / www.php.cn 在这篇文章中,我将给大家介绍如何使用PHP将excel文件导入mysql数据库.有时候我们需 ...

  7. 天堂2启动mysql就没了_启用二进制日志文件进行mysql数据恢复

    启用二进制日志文件进行mysql数据恢复 查看文件/etc/my.cnf中[mysqld]配置块的是否配置log-bin 项,用来记录数据库更改的日志, 然后设置要需要写入日志的数据库或者不要写入日志 ...

  8. mysql数据库-1.文件导入mysql表secure_file_priv报错问题解决 mysql select outfile不能导出亲测

    1.问题 Mac系统,将文件导入mysql表中,报错secure_file_priv选项未设置. 执行导入文件到表mobile_attribute_jxl命令时: load data infile ' ...

  9. csv导入mysql linux_如何将CSV文件导入MySQL表

    如何将CSV文件导入MySQL表 我有一个未规范化的事件-来自客户端的日记CSV,我试图将它加载到MySQL表中,以便将其重构为正常的格式.我创建了一个名为"CSVImport"的 ...

最新文章

  1. mysql主备模型_MySQL主从复制 - 基于二进制日志(理论篇)
  2. 别人给你网盘分享东西怎么搞到电脑上看呢?
  3. flex4.6 保留自动产生的actionscript代码的编译选项
  4. 给APK签名,修改签名
  5. 浅析Java内存模型
  6. 7-56 互评成绩 (25 分) (排序题)
  7. python na不显示 占位_Python学习之路—Python基础(一)
  8. c#Struts框架理念和自制Struts框架下 复杂版(2009-06-10)
  9. java如何美化按钮_css美化button按钮
  10. IBM SPSS Statistics描述性统计分析使用教学
  11. 2019安徽省程序设计竞赛 D自驾游 题解
  12. Codeforces 1077E Thematic Contests(二分)
  13. python 爬取有道词典翻译
  14. 天津大学计算机学院课表,天津大学软件实践1汇编语言课程教学大纲-天津大学计算机学院.PDF...
  15. Can't create pdf file with font calibri bold 错误解决方案
  16. Mac软件序列号查询工具:KCNScrew for mac
  17. 解读 Apache 多个顶级数据库项目的成长经历与开源文化理念
  18. 制作的自媒体短视频很模糊?教你3个方法,让视频变清晰
  19. IDX20803: Unable to obtain configuration from: ‘[PII is hidden
  20. linux搜索命令有哪些,linux 中的搜索命令

热门文章

  1. 选择与放弃决定着你的生命
  2. The reference to entity “XX“ must end with the ‘;‘ delimiter.
  3. 2020短视频电商直播运营方案实战干货
  4. Appium Android Bootstrap源码分析之简介
  5. 13:Scala语言的数据结构和算法
  6. ros:编译navigation
  7. git squash
  8. 第九城市CEO朱骏:一个人的掘金游戏
  9. Getting Real(推荐)
  10. coda html5,Mac Coda 前端开发插件 F2E Tools - YangJunwei