最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python解析nginx日志文件

 更新時(shí)間:2015年05月11日 10:29:56   投稿:hebedich  
Web服務(wù)器的各種系統(tǒng)管理工作包括了多Nginx/Apache 日志的統(tǒng)計(jì),python使這個(gè)任務(wù)變得極其簡單,下面我們來詳細(xì)講解下具體的做法,有需要的小伙伴可以參考下。

項(xiàng)目的一個(gè)需求是解析nginx的日志文件。
簡單的整理如下:

日志規(guī)則描述

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

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

其中一條真實(shí)記錄樣例如下:

復(fù)制代碼 代碼如下:

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代替。

項(xiàng)目中已經(jīng)按照業(yè)務(wù)規(guī)則對Nginx日志文件進(jìn)行了處理命名規(guī)則如下:

ID-ID-YYMMDD-hhmmss
并且所有的日志文件存放在統(tǒng)一路徑下。

解決思路

獲取所有日志文件path

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

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

獲取日志文件中每一行的內(nèi)容

使用Python的linecache模塊來獲取文件行的內(nèi)容

import linecache


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

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

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

linecache模塊使用緩存,所以會耗費(fèi)內(nèi)存,耗費(fèi)量與要解析的文件相關(guān)。最好在使用完畢后執(zhí)行l(wèi)inecache.clearcache()清空一下緩存。

當(dāng)然,作為優(yōu)化,這里可以利用生成器來進(jìn)行優(yōu)化。暫且按下不表。

處理日志條目

一條日志信息就是一個(gè)特定格式的字符串,因此使用正則表達(dá)式來解析,這里使用Python的re模塊。
下面,一條一條建立規(guī)則:

規(guī)則

  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>
        .*
        """

解析

復(fù)制代碼 代碼如下:

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)

這樣,就可以得到日志條目中各個(gè)要素的原始數(shù)據(jù)。

格式及內(nèi)容轉(zhuǎn)化

得到日志原始數(shù)據(jù)之后,需要根據(jù)業(yè)務(wù)要求,對原始數(shù)據(jù)進(jìn)行格式及內(nèi)容轉(zhuǎn)化。
這里需要處理的內(nèi)容包括:時(shí)間,request,userAgent

時(shí)間格式轉(zhuǎn)化

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

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

在日志信息原始數(shù)據(jù)中得到的request的內(nèi)容格式為:

/report?XXXXXX
這里只需要根據(jù)協(xié)議取出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)

接下來需要根據(jù)業(yè)務(wù)協(xié)議解析參數(shù)內(nèi)容。這里需要先利用base64模塊解碼,然后再利用struct模塊解構(gòu)內(nèi)容:

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

在日志信息原始數(shù)據(jù)中userAgent數(shù)據(jù)的格式為:

XXX; XXX; XXX; XXX
根據(jù)業(yè)務(wù)要求,只需要取出最后一項(xiàng)即可。
這里采用re模塊來解析。

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

至此,nginx日志文件解析基本完成。
剩下的工作就是根據(jù)業(yè)務(wù)需要,對獲得的基本信息進(jìn)行處理。

以上所述就是本文的全部內(nèi)容了,希望大家能夠喜歡。

相關(guān)文章

  • python中的條件賦值判斷語句語法

    python中的條件賦值判斷語句語法

    這篇文章主要介紹了python條件賦值判斷語句語法,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Python實(shí)現(xiàn)二維數(shù)組按照某行或列排序的方法【numpy lexsort】

    Python實(shí)現(xiàn)二維數(shù)組按照某行或列排序的方法【numpy lexsort】

    這篇文章主要介紹了Python實(shí)現(xiàn)二維數(shù)組按照某行或列排序的方法,結(jié)合具體實(shí)例形式分析了Python使用numpy模塊的lexsort方法針對二維數(shù)組進(jìn)行排序的常用操作技巧,需要的朋友可以參考下
    2017-09-09
  • Python文件操作函數(shù)用法實(shí)例詳解

    Python文件操作函數(shù)用法實(shí)例詳解

    這篇文章主要介紹了Python文件操作函數(shù)用法實(shí)例詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Python Pandas Dataframe.describe()使用及代碼實(shí)例

    Python Pandas Dataframe.describe()使用及代碼實(shí)例

    這篇文章主要介紹了Python Pandas Dataframe.describe()使用及代碼實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • python中GIL的原理及用法總結(jié)

    python中GIL的原理及用法總結(jié)

    在本篇文章里小編給大家整理的是一篇關(guān)于python中GIL的原理及用法總結(jié)內(nèi)容,有需要的朋友們可以學(xué)習(xí)參考下。
    2021-03-03
  • python實(shí)現(xiàn)剪貼板的操作

    python實(shí)現(xiàn)剪貼板的操作

    本文主要介紹了python實(shí)現(xiàn)剪貼板的操作,通過輸入一個(gè)命令行參數(shù),實(shí)現(xiàn)將特定的一些文本復(fù)制到剪貼板的操作。感興趣的可以了解一下
    2021-07-07
  • 關(guān)于dataframe排序 pd.rank()

    關(guān)于dataframe排序 pd.rank()

    pandas.DataFrame.rank方法支持不同的排序方式,如按行或列、升序或降序等,主要參數(shù)包括axis控制按行或列排名,method定義相同值的處理方式,numeric_only指定是否僅對數(shù)字列排序,na_option設(shè)置NaN值的排序方法,ascending確定排序方向,pct決定是否以百分比形式展示排名
    2024-09-09
  • Python Web開發(fā)模板引擎優(yōu)缺點(diǎn)總結(jié)

    Python Web開發(fā)模板引擎優(yōu)缺點(diǎn)總結(jié)

    這篇文章主要介紹了Python Web開發(fā)模板引擎優(yōu)缺點(diǎn)總結(jié),需要的朋友可以參考下
    2014-05-05
  • python操作MongoDB基礎(chǔ)知識

    python操作MongoDB基礎(chǔ)知識

    MongoDB支持好多語言,今天我們就寫一寫python操作MongoDB的知識,從安裝MongoDB到操作MongoDB全都有了。
    2013-11-11
  • python?pipreqs工具生成requirements.txt文件使用詳解

    python?pipreqs工具生成requirements.txt文件使用詳解

    這篇文章主要為大家介紹了python?pipreqs工具生成requirements.txt文件使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12

最新評論

措美县| 祁东县| 阜新市| 新营市| 新和县| 土默特左旗| 浪卡子县| 喀喇沁旗| 宁强县| 临颍县| 子洲县| 太仆寺旗| 永昌县| 开原市| 江都市| 伊通| 富裕县| 榆林市| 迭部县| 牡丹江市| 封丘县| 永川市| 会东县| 大英县| 筠连县| 射洪县| 龙山县| 仙居县| 红桥区| 五指山市| 霍林郭勒市| 鞍山市| 合川市| 平谷区| 昭平县| 莱州市| 泸州市| 虎林市| 米泉市| 察哈| 太湖县|