-
-
- 目的
- 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]#
- 目的
-