apache ログ解析

概要

Apacheのアクセスログを解析し、特定の時間枠(30分単位)における**「IPアドレス別のリクエスト数」等を算出します。

apacheのログは以下のように書式で標準なログ形式です

192.168.xxx.xxx - - [27/Apr/2026:00:20:55 +0900] "GET /index.html HTTP/1.1" 200 23158
192.168.xxx.xxx - - [27/Apr/2026:00:21:01 +0900] "GET /robots.txt HTTP/1.1" 200 125
192.168.xxx.xxx - - [27/Apr/2026:00:21:02 +0900] "GET /archives/1465 HTTP/1.1" 200 22735

基本仕様

  • 対象ログ形式: Apache 標準アクセスログ(またはそれに準ずる形式)
  • 集計単位: 30分間隔(毎時 00:00〜29:59、30:00〜59:59)
  • 出力項目:
    • 集計対象期間(開始〜終了時刻)
    • 接続元IPアドレス一覧 と 各リクエスト数(降順ソート)
    • 期間内の総リクエスト合計(TOTAL REQUESTS)

3. 動作原理

  1. 時間抽出: ログの第4フィールド(タイムスタンプ)から「時:分」を抽出する。
  2. グループ化: 「分」の値が 0〜29 か 30〜59 かを判定し、30分単位のキー(例: 12:00, 12:30)を生成する。
  3. カウント: * 「時間枠 + IPアドレス」をキーとした連想配列で、リクエスト数を加算。
    • 時間枠ごとの総計用変数を加算。
  4. 出力: * 全データを読み込んだ後、時間枠を昇順でソート。
    • 各時間枠内のIP別集計については、外部コマンド sort を利用してリクエスト数の多い順に表示する。

apache_analyze_access.sh

以下の手順で集計用のシェルスクリプトを作成します

$ vim apache_analyze_access.sh
#!/bin/bash

# 対象のログファイル
LOG_FILE=/etc/httpd/log/example.com/logs/ssl-access.log

# ファイル存在チェックの修正
if [ ! -f "$LOG_FILE" ] ; then
  echo "No such file ${LOG_FILE}"
  exit 1
fi

echo "Analyzing $LOG_FILE ..."
echo "--------------------------------------------------"

awk '
{
    time_str = substr($4, 14, 5);
    split(time_str, t, ":");
    hour = t[1];
    min = t[2];

    slot = (min < 30) ? "00" : "30";
    time_key = hour ":" slot;

    count[time_key, $1]++;
    total[time_key]++;
    times[time_key] = 1;
}
END {
    n = asorti(times, sorted_times);
    for (i = 1; i <= n; i++) {
        tk = sorted_times[i];
        end_min = (substr(tk, 4, 2) == "00") ? "29" : "59";
        
        print "=== Period: " tk " - " substr(tk, 1, 2) ":" end_min " ===";
        
        # リクエスト数が多い順にソートして表示(外部コマンドに投げる)
        # 上位10件を表示する設定、変更する場合はhead -x の箇所を変更する
        cmd = "sort -rn -k 3 | head -10"
        for (idx in count) {
            split(idx, sep, SUBSEP);
            if (sep[1] == tk) {
                printf "%-15s : %8d requests\n", sep[2], count[idx] | cmd;
            }
        }
        close(cmd);
        
        print "--------------------------------------------------";
        printf "TOTAL REQUESTS  : %8d\n", total[tk];
        print "--------------------------------------------------\n";
    }
}' "$LOG_FILE"

上位10件で表示する設定ですが、変更する場合はcmd = "sort -rn -k 3 | head -n 10" の head -n 20 等のに書き換えてください

実行件を付与して実行します

# 権限付与
chmod +x analyze_access.sh

# 実行
./analyze_access.sh
=== Period: 03:00 - 03:29 ===
192.168.1.111   :       32 requests
192.168.1.131   :       22 requests
192.168.10.80   :       15 requests
10.8.0.35       :       14 requests
10.8.2.188      :       11 requests
192.168.5.224   :       11 requests
10.8.10.118     :       10 requests
192.168.3.85    :       10 requests
10.8.62.28      :        9 requests
192.168.34.0    :        8 requests
--------------------------------------------------
TOTAL REQUESTS  :      258
--------------------------------------------------

=== Period: 03:30 - 03:59 ===
192.168.100.252 :      347 requests
10.8.174.116    :       14 requests
192.168.113.216 :       10 requests
10.8.0.35       :       10 requests
192.168.91.179  :        9 requests
10.8.44.191     :        9 requests
192.168.154.133 :        8 requests
10.8.92.16      :        8 requests
192.168.108.151 :        7 requests
10.8.32.98      :        7 requests
--------------------------------------------------
TOTAL REQUESTS  :      539
--------------------------------------------------

\ 最新情報をチェック /

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です