【アクセスログ解析】IPアドレス-件数確認

      • 目的
        • httpdなどで出力されるアクセスログを解析してどこからアクセスされたか、その件数を確認する
      • 結論
        • 以下のスクリプトを実行するとアクセス件数が分かる
      • 実行環境
        [root@ip-192-168-10-20 ec2-user]# cat /etc/os-release
        NAME="Amazon Linux"
        VERSION="2023"
        
        [root@ip-192-168-10-20 ec2-user]# python3 -V
        Python 3.9.16
      • 実行するスクリプト
        #!/usr/bin/python
        # -*- coding: utf-8 -*-
        
        import pathlib
        import os
        import datetime
        import json
        
        # ファイルのあるディレクトリ情報
        dir_path = "/var/log/httpd"
        
        # 処理フラグの宣言
        access_execution = 0
        error_execution = 0
        
        # 辞書配列定義
        result = {}
        
        # 本日の日付をYYYYMMDDの形式で取得する
        TODAY_DATE = datetime.datetime.now().strftime('%Y%m%d')
        print(TODAY_DATE)
        
        
        # ログの処理
        def analysis_processing(file_path):
            # 配列定義
            ip_address_list = []
            # ログファイルを読み込む
            with open(file_path) as read_log_file:
                for log_data in read_log_file:
                    # IPアドレス部分のみ取得する
                    ip_address = log_data.split(' ')[0]
                    # 配列にIPアドレスを登録
                    ip_address_list.append(ip_address)
            # 開いたログファイルを閉じる
            read_log_file.close()
        
        # ユニークなIPのリストを作成する
            uniq_ip_list = set(ip_address_list)
        
            # ユニークなIPを1件ずつループさせる
            for uniq_ip in uniq_ip_list:
                # 重複してアクセスされた件数をカウント
                ip_count = ip_address_list.count(uniq_ip)
                # 辞書配列にデータを登録する
                result[uniq_ip] = ip_count
        
            # 結果を出力するjsonファイルを作成する
            # 出力するファイル名
            OUTPUT_FILE_NAME = 'access_ip_result_'
            OUTPUT_FILE_NAME += TODAY_DATE
            OUTPUT_FILE_NAME += '.json'
            # 出力するファイルのパス
            OUTPUT_FILE_PATH = './'
            OUTPUT_FILE_PATH += OUTPUT_FILE_NAME
            with open(OUTPUT_FILE_PATH, 'w') as f:
                json.dump(result, f, indent=2)
        
        
        
        src = pathlib.Path(dir_path)
        # 参考:
        # https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14271336029
        files = sorted([(f, f.stat().st_mtime) for f in src.iterdir()], key=lambda x: x[1], reverse=True)
        
        for path, mtime in files:
            # ファイル名だけ取得する
            file_name = os.path.basename(path)
            print(file_name)
            # 出力例
            # [root@ip-192-168-10-20 ec2-user]# python3 access_log.py
            # /var/log/httpd/access_log 1691306369.3290484
            # /var/log/httpd/error_log 1691304487.19
            # /var/log/httpd/error_log-20230806 1688868716.6021082
            # /var/log/httpd/access_log-20230806 1688868710.602159
        
            # アクセスログの処理
            if 'access_log-' in file_name:
                # 処理フラグが立ってる場合ループから抜ける
                if access_execution == 1:
                    continue
                # 処理したよというフラグ
                print("1")
                access_execution = 1
                analysis_processing(path)
            # エラーログの処理
            if 'error_log-' in file_name:
                # エラーログはとりあえずcontinueする
                continue
                # 処理フラグが立ってる場合ループから抜ける
                if error_execution == 1:
                    continue
                # 処理したよというフラグ
                print("2")
                error_execution = 1
                analysis_processing(path)
        
        
      • 実行コマンド
        [root@ip-192-168-10-20 ec2-user]# python3 access_log.py
      • 実行結果
        [root@ip-192-168-10-20 ec2-user]# cat access_ip_result_20230819.json
        {
        "54.251.31.173": 130,
        "54.248.220.13": 130,
        "54.241.32.77": 130,
        "54.250.253.205": 131,
        "54.255.254.205": 130,
        "114.150.216.3": 4,
        "54.232.40.109": 128,
        "54.228.16.45": 129,
        "54.243.31.205": 129,
        "54.183.255.173": 129,
        "54.252.79.141": 130,
        "176.34.159.205": 128,
        "54.244.52.237": 130,
        "177.71.207.141": 128,
        "107.23.255.45": 129,
        "54.245.168.13": 130
        }[root@ip-192-168-10-20 ec2-user]#
python
スポンサーリンク
K・B・S
タイトルとURLをコピーしました