特定の時間帯でアクセスの多かった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(必要に応じて調整) |



コメント