【Python】对Apache日志进行分析
经过
在业务上经常需要分析像Apache这样的WEB服务器的访问日志。通常情况下,我们会将日志传送到splunk中,以便能够快速进行调查。但有时也会有一些没有将日志传送到splunk的情况,只是给了几百兆的日志文件让我们自行分析。在这种情况下,如果能够快速查看连接源的IP地址和访问次数,就可以更加详细地进行分析,方便实用。虽然也考虑过使用Excel进行分析的方法,但当日志量较大时,可能无法打开Excel文件,所以尝试用Python编写了一些代码。由于这只是简单的分析,所以并不经常有太大的帮助(笑)。
关于环境建设
电脑:MacBookPro2016
集成开发环境:PyCharm
版本:3.6.2
规格
以下是用中文原生方式重新表达的选项:
・可以解析的文件有两类:apache的access.log和error.log。
・统计每个IP地址的访问次数。
・按照统计后的IP地址进行降序排序。
・日志的格式请参考以下链接:
https://ossec-docs.readthedocs.io/en/latest/log_samples/apache/apache.html
・可以从以下链接下载示例文件:
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