Apacheのログファイルで特定の時間帯でアクセスが多いアカウントを調査する

Linux

特定の時間帯でアクセスの多かったApacheログを調査する

特定の時間でApacheのアクセス数が多くなり高負荷の状態となっていました。
Apacheは数100件ほどのVirtualHostがあり、目視でアクセスが多かったアカウント(VirtualHost)をログファイルから探すのは困難なったので、下記のようなシェルスクリプトを作成しました

【要件】

  • ログファイルは以下のように配置されています。アカウント名がVirtualHostとなります
    /etc/httppd/logs/[アカウント名]/ssl_access.log.20250517
  • アクセスが多かった時間帯は12時~13時頃
  • アカウントごとにアクセス件数を表示して、アクセスの多い順に並び替える
#!/bin/bash

cd /etc/httppd/logs/

find . -type f -name 'ssl_access.log.20250517' | while read logfile; do
    count=$(grep '\[17/May/2025:12:' "$logfile" | wc -l)
    echo -e "$count\t$logfile"
done | sort -nr

出力例

1023	./account001/ssl_access.log.20250517
875	./account153/ssl_access.log.20250517
2	./account099/ssl_access.log.20250517
...

ログファイル内でアクセスの多かったIPアドレスを調査

アクセスが多かったログファイルがわかりましたので、そのログファイル内でアクセスが多かったIPアドレスを調べたい場合は、以下のコマンドで調べる事ができます。

以下では、ssl_access.log.20250517 のログファイルで、2025/05/17 12時台でアクセスの多いTOP10のIPアドレスを抽出しています

$ grep '\[17/May/2025:12:' /etc/httppd/logs/account001/ssl_access.log.20250517 |  awk '{print $1}' | sort | uniq -c| sort -nr|head -10

# 出力例
340 74.125.209.32
150 74.125.209.33
 98 192.0.2.55
 60 74.125.209.34
 42 203.0.113.20

コマンドの詳細

処理内容コマンド部分
12時台のログ抽出grep ‘[17/May/2025:12:’
IPアドレス(ログの先頭)を取り出すawk ‘{print $1}’
IP順にソートsort
ユニークな件数をカウントuniq -c
カウント数で降順ソートsort -nr
上位20件表示head -10(必要に応じて調整) 

コメント

タイトルとURLをコピーしました