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