8
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【python】apacheのログ分析

Last updated at Posted at 2018-04-29

#経緯
 業務上でよく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

#メインファイル

Log_Parser.py
#-*-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)
result(access.log)
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
result(error_log)
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
8
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?