#経緯
業務上でよくapacheなどWEBサーバのアクセスログを分析することがある。通常はsplunkにログを転送しているので、すぐ調査できるが、中にはsplunkにログを転送していないものもあり、数百MBのログだけ渡されて分析してね☆ってときもある。そんなときに接続元IPアドレスとアクセス数くらいパっと見れると詳細に分析するあたりがついて便利だなって感じた。excelで分析する手段も考えたがログの量が多いときはexcelで開けないときも考慮してpythonで書いてみた。簡素な分析なのであまり役に立つ頻度は高くない(笑)
#構築環境について
PC:MacBookPro2016
IDE:pycharm
version:3.6.2
#仕様
・解析できるファイルはapacheのaccess.logとerror.logの2種類
・IPアドレス毎のアクセス回数をカウントする
・カウントしたIPアドレスの降順でソートする
・logのフォーマットは以下参照
https://ossec-docs.readthedocs.io/en/latest/log_samples/apache/apache.html
・サンプルファイルは以下からDL
http://www.monitorware.com/en/logsamples/apache.php
#メインファイル
#-*-coding:utf-8-*-
import codecs
import re
def create_dict(type):
log_dict = {}
pattarn = re.compile('.*client.*')
if type==1:
filename='access_log'
with codecs.open(filename) as f:
for i, line in enumerate(f.readlines()):
log_data = line.rstrip('\n').split(' ')
tmp = {i: log_data}
log_dict.update(tmp)
elif type==2:
filename='error_log'
with codecs.open(filename) as f:
for i, line in enumerate(f.readlines()):
if pattarn.match(line):
log_data = line.rstrip().split('client')
tmp = {i: log_data[1].split(']')}
log_dict.update(tmp)
return log_dict
def key_count(log_dict):
count_dict = {}
for v in log_dict.values():
if v[0] not in count_dict.keys():
i=1
update_data = {v[0]:i}
count_dict.update(update_data)
else:
count_dict[v[0]]+=1
return count_dict
if __name__ == "__main__":
type = int(input("access_log=1,error_log=2:"))
log_dict = create_dict(type)
count_dict=key_count(log_dict)
for k,v in sorted(count_dict.items(),key=lambda x:x[1],reverse=True):
print("host:",k,"count:",v)
access_log=1,error_log=2:1
host: 64.242.88.10 count: 452
host: 10.0.0.153 count: 270
host: h24-71-236-129.ca.shawcable.net count: 51
host: cr020r01-3.sac.overture.com count: 44
host: h24-70-69-74.ca.shawcable.net count: 32
host: market-mail.panduit.com count: 29
host: ts04-ip92.hevanet.com count: 28
access_log=1,error_log=2:2
host: 64.242.88.10 count: 96
host: 200.174.151.3 count: 2
host: 140.113.179.131 count: 2
host: 61.9.4.61 count: 2
host: 24.70.56.49 count: 1
host: 81.226.63.194 count: 1
host: 24.71.236.129 count: 1