This repository has been archived by the owner on Dec 3, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
AccessLogAnalyzer.py
133 lines (94 loc) · 4.73 KB
/
AccessLogAnalyzer.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
# -*- coding: utf-8 -*-
"""AccessLogAnalyzer.py
Automatically generated by Colaboratory.
Original file is located at
https://colab.research.google.com/drive/11uqE6uCaw7iV-Wc3rLJwY_UMd43bi4RW
# git clone していない場合の実行
"""
#!git clone https://github.com/KoukiNishihara/AccessLogAnalyzer.git
# Commented out IPython magic to ensure Python compatibility.
# %cd AccessLogAnalyzer/
"""# git clone 済みの場合の実行"""
#!pip3 install apache-log-parser
import datetime
import apache_log_parser
#これを実行するとプログラムが始まる
def Main():
#諸々の初期化
filename=['access_log'] #ファイル名
host_dict={} #ホスト名とアクセス数を格納するもの
time_list=[] #単位時間あたりのアクセス数
line_parser = apache_log_parser.make_parser("%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"")
file_num=0 #解析したファイル数
time_range=[] #解析期間
host_dict,time_list,time_range,file_num=Analyze(filename,host_dict,time_list,time_range,file_num) #ログの解析
Output(host_dict,time_list,time_range,file_num) #出力
#入力を促し,ログの解析をする
def Analyze(filename,host_dict,time_list,time_range,file_num):
time_range=input('ログを収集する期間を指定してください.指定がない場合はそのままEnterをおしてください\n例)2000/11/06 2017/11/07\n').split()
# 0時から23時までを0で初期化
for i in range(0,24):
time_list.append(0)
file_num=FileRead(filename,host_dict,time_list,time_range)
print()
filename=input('"access_log"以外に解析したいファイルがあればファイル名を入力してください.指定がない場合はそのままEnterをおしてください.\n例)ファイル名\n例)ファイル名1 ファイル名2 ・・・ ファイル名n\n').split()
file_num+=FileRead(filename,host_dict,time_list,time_range)
return host_dict,time_list,time_range,file_num
#ファイル読み込み
def FileRead(filenames=['access_log'],host_dict={},time_list=[],time_range=[]):
file_num=0
if(len(time_range)==0 or len(time_range)==2): #解析期間の指定がない場合,もしくは初めの期間と終わりの期間が指定された場合
if(len(time_range)==2): #初めの期間と終わりの期間が指定された場合
start=time_range[0]
end=time_range[1]
for name in filenames:
file_num+=1 #解析するファイル数のカウント
with open(name,'r') as fh: #ファイル読み込み
line =fh.readline() #一行づつ読み込む
while line:
log_line_data = line_parser(line)
date=log_line_data["time_received_datetimeobj"].strftime("%Y/%m/%d")
if((len(time_range)==0) or (start<=date and end>=date)): #解析期間内である場合
CountHost(log_line_data,host_dict) #host名とアクセス数をカウントする
CountPerHour(log_line_data,time_list) #単位時間あたりのアクセス数をカウント
line =fh.readline()
return file_num
# hostのアクセス数をカウント
def CountHost(log_line_data,host_dict):
host_name=log_line_data["remote_host"]
if host_name not in host_dict.keys():
i=1
update_data = {host_name:i}
host_dict.update(update_data)
else:
host_dict[host_name]+=1
return host_dict
# 単位時間あたりのカウント
def CountPerHour(log_line_data,time_list):
time_log=log_line_data['time_received_datetimeobj'].hour
time_list[time_log]+=1
return host_dict
#解析したものを出力
def Output(host_dict,time_list,time_range,file_num):
print("解析したファイルは",file_num,"個です")
if(len(host_dict)==0):
print("アクセスはありませんでした")
else :
if(len(time_range)==2):
print("解析期間は",time_range[0],"から",time_range[1],"です.")
elif(len(time_range)==0):
print("解析期間は全期間です.")
print()
for k,v in sorted(host_dict.items(),key=lambda x:x[1],reverse=True):
print("host:",k,"count:",v)
print("------------------------------")
i=0
for n in time_list:
print("hour:",i,"cout:",n)
i+=1
"""* 解析期間を指定せず他のファイルを指定してしなかった場合"""
Main()
"""* 解析期間を指定せず,他のファイル指定した場合"""
Main()
"""* 期間指定を指定して,他のファイルを指定した場合"""
Main()