最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于python實(shí)現(xiàn)cdn日志文件導(dǎo)入mysql進(jìn)行分析

 更新時(shí)間:2022年05月16日 14:18:36   作者:??夢(mèng)想橡皮擦????  
這篇文章主要介紹了基于python實(shí)現(xiàn)cdn日志文件導(dǎo)入mysql進(jìn)行分析,本文以阿里云CDN日志作為輔助查詢數(shù)據(jù)展開主題內(nèi)容,其它云平臺(tái)大同小異,需要的小伙伴可以參考一下

一、本文需求背景

周六日出現(xiàn)CDN大量請(qǐng)求,現(xiàn)需要分析其請(qǐng)求頻次與來源,查詢是否存在被攻擊問題。

本文以阿里云CDN日志作為輔助查詢數(shù)據(jù),其它云平臺(tái)大同小異。

系統(tǒng)提供的離線日志如下所示:

二、需求落地如下

日志實(shí)例如下所示:

[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"

其中相關(guān)字段的解釋如下:

  • [9/Jun/2015:01:58:09 +0800]:日志開始時(shí)間。
  • 10.10.10.10:訪問IP。
  • -:代理IP。
  • 1542:請(qǐng)求響應(yīng)時(shí)間,單位為毫秒。
  • "-": HTTP請(qǐng)求頭中的Referer。
  • GET:請(qǐng)求方法。
  • http://www.aliyun.com/index.html:用戶請(qǐng)求的URL鏈接。
  • 200:HTTP狀態(tài)碼。
  • 191:請(qǐng)求大小,單位為字節(jié)。
  • 2830:請(qǐng)求返回大小,單位為字節(jié)。
  • MISS:命中信息。
    • HIT:用戶請(qǐng)求命中了CDN邊緣節(jié)點(diǎn)上的資源(不需要回源)。
    • MISS:用戶請(qǐng)求的內(nèi)容沒有在CDN邊緣節(jié)點(diǎn)上緩存,需要向上游獲取資源(上游可能是CDN L2節(jié)點(diǎn),也可能是源站)。
  • Mozilla/5.0(compatible; AhrefsBot/5.0; +http://example.com/robot/):User-Agent請(qǐng)求頭信息。
  • text/html:文件類型。

按照上述字段說明創(chuàng)建一個(gè) MySQL 表,用于后續(xù)通過 Python 導(dǎo)入 MySQL 數(shù)據(jù),字段可以任意定義

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 批量導(dǎo)入數(shù)據(jù)庫中,解析代碼如下,在提前開始前需要先看一下待提取的每行數(shù)據(jù)內(nèi)容。

[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"

初看之下,我們會(huì)使用空格進(jìn)行切片,例如下述代碼:

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)

運(yùn)行之后,會(huì)發(fā)現(xiàn)里面的開始時(shí)間位置,UA位置都存在空格,所以該方案舍棄,接下來使用正則表達(dá)式提取。

參考待提取的模板編寫正則表達(dá)式如下所示:

\[(?<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>.*?)\"

接下來進(jìn)行循環(huán)讀取數(shù)據(jù),然后進(jìn)行提?。?/strong>

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)

讀取到數(shù)據(jù)存儲(chǔ)到 wait_list 列表中,然后操作列表,寫入MySQL,該操作為了防止SQL語句過長(zhǎng),所以每次間隔1000元素進(jìn)行插入。

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()

最終的結(jié)果如下所示:

導(dǎo)入MySQL之后,就可以按照自己的需求進(jìn)行排序與查詢了。

三、自定義查詢

可以通過 refer 計(jì)算請(qǐng)求次數(shù):

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

到此這篇關(guān)于基于python實(shí)現(xiàn)cdn日志文件導(dǎo)入mysql進(jìn)行分析的文章就介紹到這了,更多相關(guān)cdn日志導(dǎo)入mysql內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 如何利用pandas工具輸出每行的索引值、及其對(duì)應(yīng)的行數(shù)據(jù)

    如何利用pandas工具輸出每行的索引值、及其對(duì)應(yīng)的行數(shù)據(jù)

    這篇文章主要介紹了如何利用pandas工具輸出每行的索引值、及其對(duì)應(yīng)的行數(shù)據(jù),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • 使用Python為中秋節(jié)繪制一塊美味的月餅

    使用Python為中秋節(jié)繪制一塊美味的月餅

    這篇文章主要介紹了使用Python為中秋節(jié)繪制一塊美味的月餅,,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09
  • Queue 實(shí)現(xiàn)生產(chǎn)者消費(fèi)者模型(實(shí)例講解)

    Queue 實(shí)現(xiàn)生產(chǎn)者消費(fèi)者模型(實(shí)例講解)

    下面小編就為大家?guī)硪黄猀ueue 實(shí)現(xiàn)生產(chǎn)者消費(fèi)者模型(實(shí)例講解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-11-11
  • 簡(jiǎn)單了解Python3 bytes和str類型的區(qū)別和聯(lián)系

    簡(jiǎn)單了解Python3 bytes和str類型的區(qū)別和聯(lián)系

    這篇文章主要介紹了簡(jiǎn)單了解Python3 bytes和str類型的區(qū)別和聯(lián)系,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Python腳本實(shí)現(xiàn)Web漏洞掃描工具

    Python腳本實(shí)現(xiàn)Web漏洞掃描工具

    這是去年畢設(shè)做的一個(gè)Web漏洞掃描小工具,主要針對(duì)簡(jiǎn)單的SQL注入漏洞、SQL盲注和XSS漏洞。下文給大家介紹了使用說明和源代碼,一起看看吧
    2016-10-10
  • Python 列表 sort()函數(shù)使用實(shí)例詳解

    Python 列表 sort()函數(shù)使用實(shí)例詳解

    這篇文章主要介紹了Python 列表 sort()函數(shù)使用詳解,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07
  • Opencv識(shí)別圖片顏色并繪制輪廓實(shí)現(xiàn)代碼示例

    Opencv識(shí)別圖片顏色并繪制輪廓實(shí)現(xiàn)代碼示例

    這篇文章主要給大家介紹了關(guān)于Opencv識(shí)別圖片顏色并繪制輪廓實(shí)現(xiàn)的相關(guān)資料,實(shí)驗(yàn)代碼和現(xiàn)象展示了如何從原始圖像中識(shí)別和突出顯示特定顏色區(qū)域,并通過圖像處理技術(shù)增強(qiáng)識(shí)別效果,需要的朋友可以參考下
    2024-12-12
  • 簡(jiǎn)單介紹Python虛擬環(huán)境及使用方法

    簡(jiǎn)單介紹Python虛擬環(huán)境及使用方法

    Python的虛擬環(huán)境極大地方便了人們的生活.本文介紹了虛擬環(huán)境的基礎(chǔ)知識(shí)以及使用方法,文中有非常詳細(xì)的說明,需要的朋友可以參考下
    2021-06-06
  • 如何使用python操作vmware

    如何使用python操作vmware

    這篇文章主要介紹了如何使用python操作vmware,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • 關(guān)于pytorch訓(xùn)練分類器

    關(guān)于pytorch訓(xùn)練分類器

    這篇文章主要介紹了關(guān)于pytorch訓(xùn)練分類器問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09

最新評(píng)論

嵩明县| 邹城市| 高陵县| 湘潭县| 碌曲县| 云林县| 房产| 梅州市| 延边| 柳河县| 胶州市| 博白县| 松滋市| 洪雅县| 天柱县| 英山县| 凌源市| 镇雄县| 美姑县| 上饶市| 北安市| 额济纳旗| 宜州市| 霍邱县| 长泰县| 清流县| 昌平区| 渝中区| 胶南市| 广南县| 玛沁县| 芦山县| 叶城县| 汾阳市| 琼结县| 罗平县| 永吉县| 松滋市| 四川省| 天门市| 鄄城县|