溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

python實(shí)現(xiàn)的分析并統(tǒng)計(jì)nginx日志數(shù)據(jù)功能示例

發(fā)布時(shí)間:2020-09-11 05:06:16 來(lái)源:腳本之家 閱讀:207 作者:hnr1017 欄目:開(kāi)發(fā)技術(shù)

本文實(shí)例講述了python實(shí)現(xiàn)的分析并統(tǒng)計(jì)nginx日志數(shù)據(jù)功能。分享給大家供大家參考,具體如下:

利用python腳本分析nginx日志內(nèi)容,默認(rèn)統(tǒng)計(jì)ip、訪問(wèn)url、狀態(tài),可以通過(guò)修改腳本統(tǒng)計(jì)分析其他字段。

一、腳本運(yùn)行方式

python count_log.py -f med.xxxx.com.access.log

二、腳本內(nèi)容

#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
1.分析日志,每行日志按空格切分,取出需要統(tǒng)計(jì)的相應(yīng)字段,作為字典的key,遍歷相加
2.使用到字典的get方法,通過(guò)定義默認(rèn)值,避免miss key的錯(cuò)誤
3.使用列表解析表達(dá)式
4.使用sorted函數(shù)排序列表
5.使用argparse傳入?yún)?shù)
6.nginx日志格式:
log_format     access_log
  '$remote_addr - $remote_user [$time_local] $request '
  '"$status" $body_bytes_sent "$http_referer" '
  '"$http_user_agent" "$request_time"' '"$upstream_addr"' '"$upstream_response_time"';
7.日志內(nèi)容:
222.xx.xxx.15 - - [07/Dec/2016:00:03:27 +0800] GET /app/xxx/xxx.apk HTTP/1.0 "304" 0 "-" "Mozilla/5.0 Gecko/20100115 Firefox/3.6" "0.055""-""-"
8.腳本運(yùn)行結(jié)果:
('106.xx.xx.46', '/gateway/xxx/user/mxxxxx/submitSelfTestOfSingleQuestion', '"200"', 299)
('182.1xx.xx.83', '/', '"200"', 185)
('222.xx.1xx.15', '/', '"200"', 152)
('125.xx.2xx.58', '/', '"200"', 145)
"""
import argparse
def count_log(filename, num):
  try:
    with open(filename) as f:
      dic = {}
      for l in f:
        if not l == '\n': # 判斷空白行
          arr = l.split(' ')
          ip = arr[0]
          url = arr[6]
          status = arr[8]
          # 字典的key是有多個(gè)元素構(gòu)成的元組
          # 字典的get方法,對(duì)取的key的值加1,第一次循環(huán)時(shí)由于字典為空指定的key不存在返回默認(rèn)值0,因此讀第一行日志時(shí),統(tǒng)計(jì)結(jié)果為1
          dic[(ip, url, status)] = dic.get((ip, url, status), 0) + 1
    # 從字典中取出key和value,存在列表中,由于字典的key比較特殊是有多個(gè)元素構(gòu)成的元組,通過(guò)索引k[#]的方式取出key的每個(gè)元素
    dic_list = [(k[0], k[1], k[2], v) for k, v in dic.items()]
    for k in sorted(dic_list, key=lambda x: x[3], reverse=True)[:num]:
      print(k)
  except Exception as e:
    print("open file error:", e)
if __name__ == '__main__':
  parser = argparse.ArgumentParser(description="傳入日志文件")
  # 定義必須傳入日志文件,使用格式-f filename
  parser.add_argument('-f', action='store', dest='filename', required=True)
  # 通過(guò)-n傳入數(shù)值,取出最多的幾行,默認(rèn)取出前10
  parser.add_argument('-n', action='store', dest='num', type=int, required=False, default=10)
  given_args = parser.parse_args()
  filename = given_args.filename
  num = given_args.num
  count_log(filename, num)

更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《Python日志操作技巧總結(jié)》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python入門(mén)與進(jìn)階經(jīng)典教程》及《Python文件與目錄操作技巧匯總》

希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI