はじめに
この記事のスクリプトは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 サイトに注意してください。