ホームページ  >  記事  >  バックエンド開発  >  Pythonによるnginxアクセスログの定期分析

Pythonによるnginxアクセスログの定期分析

高洛峰
高洛峰オリジナル
2017-02-21 10:46:401276ブラウズ

はじめに

この記事のスクリプトはnginxのアクセスログを解析するもので、主にサイトuriへのアクセス数を確認するためのものです。分析に関しては正規表現を使用する必要があるため、正規ルールに触れたことのない友人は自分で頭を補うことが求められます。これは、正規ルールの内容に関わるものであり、それについて書くことは実際には不可能であるためです。 . 通常ルールの内容は膨大すぎて、1 つや 2 つの記事では明確に書ききれません。

始める前に、分析対象のログ構造を見てみましょう:

127.0.0.1 - - [19/Jun/2012:09:16:22 +0100] "GET /GO.jpg HTTP/1.1" 499 0 "http://domain.com/htm_data/7/1206/758536.html" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; SE 2.X MetaSr 1.0)"
127.0.0.1 - - [19/Jun/2012:09:16:25 +0100] "GET /Zyb.gif HTTP/1.1" 499 0 "http://domain.com/htm_data/7/1206/758536.html" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; QQDownload 711; SV1; .NET4.0C; .NET4.0E; 360SE)"

これは、変更されたログの内容が削除または置き換えられていますが、分析結果には影響しません。もちろん、Nginx のアクセス ログは企業ごとにカスタマイズできるため、スクリプトの内容を理解し、独自の変更を加えて自分の作業に適用できることが重要です。私が提供したログの形式は単なる参考です。あなたの会社のサーバーで表示されるログ形式は、私のものとは明らかに異なるはずです。ログ形式を読んだ後、スクリプトを書き始めます

最初にコードを投稿します。説明:

import re
from operator import itemgetter
 
def parser_logfile(logfile):
 pattern = (r''
   '(\d+.\d+.\d+.\d+)\s-\s-\s' #IP address
   '\[(.+)\]\s' #datetime
   '"GET\s(.+)\s\w+/.+"\s' #requested file
   '(\d+)\s' #status
   '(\d+)\s' #bandwidth
   '"(.+)"\s' #referrer
   '"(.+)"' #user agent
  )
 fi = open(logfile, 'r')
 url_list = []
 for line in fi:
  url_list.append(re.findall(pattern, line))
 fi.close()
 return url_list
 
def parser_urllist(url_list):
 urls = []
 for url in url_list:
  for r in url: 
   urls.append(r[5])
 return urls
 
def get_urldict(urls):
 d = {}
 for url in urls:
  d[url] = d.get(url,0)+1
 return d
 
def url_count(logfile):
 url_list = parser_logfile(logfile)
 urls = parser_urllist(url_list)
 totals = get_urldict(urls)
 return totals
 
if __name__ == '__main__':
 urls_with_counts = url_count('example.log')
 sorted_by_count = sorted(urls_with_counts.items(), key=itemgetter(1), reverse=True)
 print(sorted_by_count)

スクリプトの説明、parser_logfile()函数功能是分析日志,返回匹配的行列表,正则部分就不解释了,大家看注释应该知道它是匹配什么内容的,parser_urllist()函数功能是将获取用户访问的url,get_urldict()函数功能是返回一个字典,以url为键,如果键相同值增1,返回的字典是每个url和最大的访问次数,url_count()関数は、メイン関数部分で、指定された要素でソートできる itemgetter について説明します。例で理解できます:

>>> from operator import itemgetter
>>> a=[('b',2),('a',1),('c',0)] 
>>> s=sorted(a,key=itemgetter(1))
>>> s
[('c', 0), ('a', 1), ('b', 2)]
>>> s=sorted(a,key=itemgetter(0))
>>> s
[('a', 1), ('b', 2), ('c', 0)]

reverse=True パラメータは降順、つまり、大きいものから小さいものへの並べ替えを示します。 スクリプトの実行結果は次のようになります:

[('http://domain.com/htm_data/7/1206/758536.html', 141), ('http://domain.com/?q=node&page=12', 3), ('http://website.net/htm_data/7/1206/758536.html', 1)]

Python による nginx アクセス ログの定期的な分析に関連する場合は、PHP 中国語 Web サイトに注意してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。