使用Python解析nginx日誌檔案

發表於2016-04-07

專案的一個需求是解析nginx的日誌檔案。
簡單的整理如下:


日誌規則描述

首先要明確自己的Nginx的日誌格式,這裡採用預設Nginx日誌格式:

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

其中,客戶端型號資訊用XXXXXXX代替。

專案中已經按照業務規則對Nginx日誌檔案進行了處理命名規則如下:

並且所有的日誌檔案存放在統一路徑下。

解決思路


獲取所有日誌檔案path

這裡使用Python的glob模組來獲取日誌檔案path

獲取日誌檔案中每一行的內容

使用Python的linecache模組來獲取檔案行的內容

注意:linecache模組使用了快取,所以存在以下問題:

  1. 在使用linecache模組讀取檔案內容以後,如果檔案發生了變化,那麼需要使用linecache.updatecache(filename)來更新快取,以獲取最新變化。
  2. linecache模組使用快取,所以會耗費記憶體,耗費量與要解析的檔案相關。最好在使用完畢後執行linecache.clearcache()清空一下快取。

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

處理日誌條目

一條日誌資訊就是一個特定格式的字串,因此使用正規表示式來解析,這裡使用Python的re模組。
下面,一條一條建立規則:

規則

解析

這樣,就可以得到日誌條目中各個要素的原始資料。


格式及內容轉化

得到日誌原始資料之後,需要根據業務要求,對原始資料進行格式及內容轉化。
這裡需要處理的內容包括:時間,request,userAgent

時間格式轉化

在日誌資訊原始資料中存在Dec這樣的資訊,利用Python的time模組可以方便的進行解析

解析request

在日誌資訊原始資料中得到的request的內容格式為:

這裡只需要根據協議取出XXXXXX即可。
這裡仍然採用Python的re模組

接下來需要根據業務協議解析引數內容。這裡需要先利用base64模組解碼,然後再利用struct模組解構內容:

解析userAgent

在日誌資訊原始資料中userAgent資料的格式為:

根據業務要求,只需要取出最後一項即可。
這裡採用re模組來解析。


至此,nginx日誌檔案解析基本完成。
剩下的工作就是根據業務需要,對獲得的基本資訊進行處理。
(完)

 

相關文章