1. 程式人生 > 程式設計 >python實現的分析並統計nginx日誌資料功能示例

python實現的分析並統計nginx日誌資料功能示例

本文例項講述了python實現的分析並統計nginx日誌資料功能。分享給大家供大家參考,具體如下:

利用python指令碼分析nginx日誌內容,預設統計ip、訪問url、狀態,可以通過修改指令碼統計分析其他欄位。

一、指令碼執行方式

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

二、指令碼內容

#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
1.分析日誌,每行日誌按空格切分,取出需要統計的相應欄位,作為字典的key,遍歷相加
2.使用到字典的get方法,通過定義預設值,避免miss key的錯誤
3.使用列表解析表示式
4.使用sorted函式排序列表
5.使用argparse傳入引數
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.日誌內容:
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.指令碼執行結果:
('106.xx.xx.46','/gateway/xxx/user/mxxxxx/submitSelfTestOfSingleQuestion','"200"',299)
('182.1xx.xx.83','/',185)
('222.xx.1xx.15',152)
('125.xx.2xx.58',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是有多個元素構成的元組
          # 字典的get方法,對取的key的值加1,第一次迴圈時由於字典為空指定的key不存在返回預設值0,因此讀第一行日誌時,統計結果為1
          dic[(ip,url,status)] = dic.get((ip,status),0) + 1
    # 從字典中取出key和value,存在列表中,由於字典的key比較特殊是有多個元素構成的元組,通過索引k[#]的方式取出key的每個元素
    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)
  # 通過-n傳入數值,取出最多的幾行,預設取出前10
  parser.add_argument('-n',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)

更多關於Python相關內容感興趣的讀者可檢視本站專題:《Python日誌操作技巧總結》、《Python函式使用技巧總結》、《Python字串操作技巧彙總》、《Python入門與進階經典教程》及《Python檔案與目錄操作技巧彙總》

希望本文所述對大家Python程式設計有所幫助。