最新国产好看的视频,伊人天堂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ù)變得極其簡(jiǎn)單,下面我們來(lái)詳細(xì)講解下具體的做法,有需要的小伙伴可以參考下。

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

日志規(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"

其中,客戶端型號(hào)信息用XXXXXXX代替。

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

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

解決思路

獲取所有日志文件path

這里使用Python的glob模塊來(lái)獲取日志文件path

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

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

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

import linecache


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

注意:linecache模塊使用了緩存,所以存在以下問(wèn)題:

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

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

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

處理日志條目

一條日志信息就是一個(gè)特定格式的字符串,因此使用正則表達(dá)式來(lái)解析,這里使用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ù)要求,對(duì)原始數(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)

接下來(lái)需要根據(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模塊來(lái)解析。

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ù)需要,對(duì)獲得的基本信息進(jìn)行處理。

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

相關(guān)文章

  • python中的條件賦值判斷語(yǔ)句語(yǔ)法

    python中的條件賦值判斷語(yǔ)句語(yǔ)法

    這篇文章主要介紹了python條件賦值判斷語(yǔ)句語(yǔ)法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(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方法針對(duì)二維數(shù)組進(jìn)行排序的常用操作技巧,需要的朋友可以參考下
    2017-09-09
  • Python文件操作函數(shù)用法實(shí)例詳解

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

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

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

    這篇文章主要介紹了Python Pandas Dataframe.describe()使用及代碼實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(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)剪貼板的操作,通過(guò)輸入一個(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指定是否僅對(duì)數(shù)字列排序,na_option設(shè)置NaN值的排序方法,ascending確定排序方向,pct決定是否以百分比形式展示排名
    2024-09-09
  • Python Web開(kāi)發(fā)模板引擎優(yōu)缺點(diǎn)總結(jié)

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

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

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

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

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

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

最新評(píng)論

高淳县| 铜川市| 盐城市| 六安市| 安化县| 定安县| 叙永县| 香格里拉县| 天津市| 常山县| 安新县| 健康| 阿巴嘎旗| 达拉特旗| 廊坊市| 延边| 祥云县| 汉寿县| 桦川县| 盐山县| 凌云县| 万安县| 达拉特旗| 灵台县| 静海县| 周口市| 鄯善县| 教育| 浮梁县| 榆社县| 金堂县| 扬州市| 休宁县| 富蕴县| 新化县| 清河县| 苗栗市| 无为县| 兴宁市| 手游| 丰镇市|