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

