python 正則分析nginx日誌

2021-09-04 02:01:48 字數 2982 閱讀 9420

有個需求要分析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跑一下的結...