有個需求要分析nginx日誌,也懶得去研究logstach之類的開源工具,乾脆直接寫乙個指令碼,自己根據需求來實現:
先看日誌格式:我們跟別人的不太一樣,所以沒辦法了:
上面是我的日誌格式:
指令碼如下:
#!/usr/bin/env python
#-*- coding:utf-8 –*-
#author:xiaoluo
#date:2015:05:12
import re
import sys
log = sys.argv[1]
ip = r"?p[\d.]*"
date = r"?p\d+"
month = r"?p\w+"
year = r"?p\d+"
log_time = r"?p\s+"
timezone = r"""?p[^\"]*
"""name = r"""?p\"
[^\"]*\"
"""method = r"?p\s+"
request = r"?p\s+"
protocol = r"?p\s+"
status = r"?p\d+"
bodybytessent = r"?p\d+"
refer = r"""?p\"
[^\"]*\"
"""useragent=r"""?p.*
"""#f = open('access1.log','r')
#for logline in f.readlines():
p = re.compile(r"(%s)\ \[(%s)/(%s)/(%s)\:(%s)\ (%s)\ (%s)\ (%s)\ (%s)\ (%s)\ (%s)\ (%s)\ (%s)\ (%s)" %(ip, date, month, year, log_time,timezone,name,method,request,protocol,status,bodybytessent,refer,useragent), re.verbose)
def getcode():
codedic={}
f = open(log,'r')
for logline in f.readlines():
matchs = p.match(logline)
if matchs !=none:
allgroups =matchs.groups()
status= allgroups[10]
codedic[status]=codedic.get(status,0) +1
return codedic
f.close()
def getip():
f = open(log,'r')
ipdic={}
for logline in f.readlines():
matchs = p.match(logline)
if matchs !=none:
allgroups =matchs.groups()
ip=allgroups[0]
ipdic[ip] = ipdic.get(ip,0) +1
ipdic=sorted(ipdic.iteritems(),key=lambda c:c[1],reverse=true)
ipdic=ipdic[0:21:1]
return ipdic
f.close()
def geturl():
f = open(log,'r')
urldic={}
for logline in f.readlines():
matchs = p.match(logline)
if matchs !=none:
allgroups =matchs.groups()
urlname = allgroups[6]
urldic[urlname] = urldic.get(urlname,0) +1
urldic=sorted(urldic.iteritems(),key=lambda c:c[1],reverse=true)
urldic=urldic[0:21:1]
return urldic
def getpv():
f = open(log,'r')
pvdic={}
for logline in f.readlines():
matchs = p.match(logline)
if matchs !=none:
allgroups =matchs.groups()
timezone=allgroups[4]
time = timezone.split(':')
minute = time[0]+":"+time[1]
pvdic[minute]=pvdic.get(minute,0) +1
pvdic=sorted(pvdic.iteritems(),key=lambda c:c[1],reverse=true)
pvdic=pvdic[0:21:1]
return pvdic
if __name__=='__main__':
print "**監控狀況檢查狀態碼"
print getcode()
print getip()
print "**訪問最多的20個站點名"
print geturl()
print getpv()
這裡要指出的是。我當初是給正則匹配的時候單獨封裝乙個函式的,這樣就省去了下面每個函式要開啟之前都要單獨開啟一遍檔案,但是我return的時候只能用列表的形式返回,結果列表太大把我的記憶體耗光了,我的是32g的記憶體,15g的日誌。
效果:
最後乙個函式是統計每分鐘,訪問的數量
python正則分析nginx的訪問日誌
前言 本文的指令碼是分析nginx的訪問日誌,主要為了檢查站點uri的訪問次數的,檢查的結果會提供給研發人員做參考,因為談到分析嘛,那肯定要用到正規表示式了,所以請沒有接觸過正則的小夥伴自行補腦,因為涉及正則的內容,實在沒法展開寫,正則的內容太過龐大,根本不是一篇兩篇能寫清楚的。開始前,我們先看看要...
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跑一下的結...