溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python怎么解析nginx日志

發布時間:2020-08-24 18:10:34 來源:億速云 閱讀:349 作者:Leah 欄目:編程語言

這篇文章運用簡單易懂的例子給大家介紹Python怎么解析nginx日志,代碼非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

Python項目的一個需求是解析nginx的日志文件,這里給出詳細過程解析。

日志規則描述

首先要明確自己的Nginx的日志格式,這里采用默認Nginx日志格式:

log_format main '$remote_addr - $remote_user [$time_local] "$request" '
         '$status $body_bytes_sent "$http_referer" '
         '"$http_user_agent" "$http_x_forwarded_for"';

其中一條真實記錄樣例如下:

代碼如下:

172.22.8.207 - - [16/Dec/2014:17:57:35 +0800] "GET /report?DOmjjuS6keWJp+WculSQAgdUkAIPODExMzAwMDJDN0FC HTTP/1.1" 200 0 "-" "XXXXXXX/1.0.16; iPhone/iOS 8.1.2; ; 8DA77E2F91D0"

其中,客戶端型號信息用XXXXXXX代替。

項目中已經按照業務規則對Nginx日志文件進行了處理命名規則如下:

ID-ID-YYMMDD-hhmmss

并且所有的日志文件存放在統一路徑下。

解決思路

獲取所有日志文件path

這里使用Python的glob模塊來獲取日志文件path

import glob
def readfile(path):
  return glob.glob(path + '*-*-*-*')

獲取日志文件中每一行的內容

使用Python的linecache模塊來獲取文件行的內容

import linecache
 
 
def readline(path):
  return linecache.getlines(path)

注意:linecache模塊使用了緩存,所以存在以下問題:

在使用linecache模塊讀取文件內容以后,如果文件發生了變化,那么需要使用linecache.updatecache(filename)來更新緩存,以獲取最新變化。

linecache模塊使用緩存,所以會耗費內存,耗費量與要解析的文件相關。最好在使用完畢后執行linecache.clearcache()清空一下緩存。

當然,作為優化,這里可以利用生成器來進行優化。暫且按下不表。

處理日志條目

一條日志信息就是一個特定格式的字符串,因此使用正則表達式來解析,這里使用Python的re模塊。

下面,一條一條建立規則:

規則

  ip = r"?P<ip>[\d.]*"
  date = r"?P<date>\d+"
  month = r"?P<month>\w+"
  year = r"?P<year>\d+"
  log_time = r"?P<time>\S+"
  method = r"?P<method>\S+"
  request = r"?P<request>\S+"
  status = r"?P<status>\d+"
  bodyBytesSent = r"?P<bodybytessent>\d+"
  refer = r"""?P<refer>
       [^\"]*
       """
  userAgent=r"""?P<useragent>
        .*
        """
</useragent></refer></bodybytessent></status></request></method></time></year></month></date></ip>

解析

代碼如下:

p = re.compile(r"(%s)\ -\ -\ \[(%s)/(%s)/(%s)\:(%s)\ [\S]+\]\ \"(%s)?[\s]?(%s)?.*?\"\ (%s)\ (%s)\
 \"(%s)\"\ \"(%s).*?\"" 
 %( ip, date, month, year, log_time, method, request, status, bodyBytesSent, refer, userAgent ),\
  re.VERBOSE)
m = re.findall(p, logline)

這樣,就可以得到日志條目中各個要素的原始數據。

格式及內容轉化

得到日志原始數據之后,需要根據業務要求,對原始數據進行格式及內容轉化。

這里需要處理的內容包括:時間,request,userAgent

時間格式轉化

在日志信息原始數據中存在Dec這樣的信息,利用Python的time模塊可以方便的進行解析

import time
def parsetime(date, month, year, log_time):
  time_str = '%s%s%s %s' %(year, month, date, log_time)
  return time.strptime(time_str, '%Y%b%d %H:%M:%S')

解析request

在日志信息原始數據中得到的request的內容格式為:

/report?XXXXXX

這里只需要根據協議取出XXXXXX即可。

這里仍然采用Python的re模塊

import re
def parserequest(rqst):
  param = r"?P<param>.*"
  p = re.compile(r"/report\?(%s)" %param, re.VERBOSE)
  return re.findall(p, rqst)

接下來需要根據業務協議解析參數內容。這里需要先利用base64模塊解碼,然后再利用struct模塊解構內容:

import struct
import base64
def parseparam(param):
  decodeinfo = base64.b64decode(param)
  s = struct.Struct('!x' + bytes(len(decodeinfo) - (1 + 4 + 4 + 12)) + 'xii12x')
  return s.unpack(decodeinfo)

解析userAgent

在日志信息原始數據中userAgent數據的格式為:

XXX; XXX; XXX; XXX

根據業務要求,只需要取出最后一項即可。

這里采用re模塊來解析。

import re
def parseuseragent(useragent):
  agent = r"?P<agent>.*"
  p = re.compile(r".*;.*;.*;(%s)" %agent, re.VERBOSE)
  return re.findall(p, useragent)

至此,nginx日志文件解析基本完成。

剩下的工作就是根據業務需要,對獲得的基本信息進行處理。

關于Python怎么解析nginx日志就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女