python正則分析nginx的訪問日誌

2022-10-04 09:18:09 字數 2649 閱讀 9409

前言

本文的指令碼是分析nginx的訪問日誌, 主要為了檢查站點uri的訪問次數的,檢查的結果會提供給研發人員做參考,因為談到分析嘛,那肯定要用到正規表示式了,所以請沒有接觸過正則的小夥伴自行補腦,因為涉及正則的內容,實在沒法展開寫,正則的內容太過龐大,根本不是一篇兩篇能寫清楚的。

開始前,我們先看看要分析的日誌結構:

這是修改過的日誌內容,敏感內容都以刪除或替換了,不過不影響我們的分析結果,當然格式什麼的這都不重要,nginx訪問日誌是可以自定義的,每家公司可能都會稍有不同,所以要能理解指令碼內容,並通過自己修改應用到了自己工作中才是重點,我給的日誌格式也就是個參考,我打賭你在你公司伺服器上看到的日誌格式肯定跟我的格式不一樣, 看完日誌格式,我們開始要寫我們的指令碼了

我先貼**,稍後解釋:

import re

from operator import itemgetter

def parser_logfile(logfile):

pattern = (r''

'(\d+.\d+.\d+.\d+)\s-\s-\s' #ip address

'\[(.+)\]\s' #datetime

'"get\s(.+)\s\w+/.+"\s' #requested file

程式設計客棧'(\d+)\s' #status

'(\d+)\s' #bandwidth

'"(.+)"\s' #referrer

'"(.+)"' #user agent

) fi = open(logfile, 'r')

url_list =

for line in fi:

url_list.append(re.findall(pattern, line))

fi.close()

return url_list

def parser_urllist(url_list):

urls =

for url in url_list:

for r in url:

urls.append(r[5])

return urls

def get_urldict(urls):

d = {}

for url in urls:

d[url] = d.get(url,0)+1

return d

def url_count(logfile):

url_list = parser_logfile(logfile)

urls = parser_urllist(url_list)

totals = get_urldict(urls)

return totals

if __name__ == '__main__':

urls_with_counts = url_count('example.log')

sorted_by_count = sorted(urls_with_counts.items(), key=itemgetter(1), reverse=true)

print(sorted_by_count)

指令碼解釋,parser_logfile()函式功能是分析日誌,返回匹配的行列表,正則部分就不解釋了,大家看注釋應該知道它是匹配什麼內容的,parser_urllist()函式功能是將獲取使用者訪問的url,get_urldict()函式功能是返回乙個字典,以url為鍵,如果鍵相同值增1,返回的字典是每個url和最大的訪問次數,url_count()函式功能就是呼叫了之前定義的函式,主函式部分,就說說itemgetter,它可以實現按指定元素進行排序,舉例就明白了:

>>> from operator import itemgetter

>>> a=[('b',2),('a',1),('c',0)]

>>> s=sorted(a,key=itemgetter(1))

>>> s

[('c', 0), ('a', 1), ('b', 2)]

>>> s=sorted(a,key=itemgetter(0))

>>>程式設計客棧; s

[('a', 1), ('b', 2), ('c', 0)]

reverse=true引數表示降序排序,就是從大到小排序,指令碼執行結果:

[('', 141), ('', 3), ('', 1)]

總結本文標題: python正則分析nginx的訪問日誌

本文位址: /jiaoben/python/176958.html

python 正則分析nginx日誌

有個需求要分析nginx日誌,也懶得去研究logstach之類的開源工具,乾脆直接寫乙個指令碼,自己根據需求來實現 先看日誌格式 我們跟別人的不太一樣,所以沒辦法了 上面是我的日誌格式 指令碼如下 usr bin env python coding utf 8 author xiaoluo date...

Python正規表示式,統計分析nginx訪問日誌

目標 1.正規表示式 2.oop程式設計,統計nginx訪問日誌中不同ip位址出現的次數並排序 1.正規表示式 usr bin env python coding utf 8 importre match 方法一 pattern1 re.compile r hello re.i match patt...

Python正則簡單例項分析

悄悄打入公司內部ued的乙個python愛好者小眾群,前兩天一位牛人發了條訊息 小的測試題 re.split w test,test,test.返回什麼結果 一開始看,我倒沒注意w是大寫的,以為是小寫的w代表單詞字元 含下程式設計客棧劃線 今天執行一看才發現是大寫的。在idl程式設計客棧e跑一下的結...