前言
本文的指令碼是分析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跑一下的結...