【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
广告
将在 10 秒后关闭
bannerAds