ログを分析することはサーバー管理で大切なことです。
ツールを利用することもあると思いますが、コマンドも便利に使えます。
対象のログは /var/log/apache2/access.logとします。
今回、2つの方法を紹介します。どちらもcronに登録して自動実行させることが前提です。
結果はメールで送信させますが、その部分は割愛します。
自動実行させるタイミングは運用の考え方次第ですが、サンプルとして1時間ごと(毎時0分)にします。
ポイントは「時間範囲の指定」だと思いますが、「範囲」ということで最初に思いつくのが
不等号(>や<)です。
まずログの時間部分を取り出す部分ですが、IPアドレス別の集計をするために
grep "-" /var/log/apache2/access.log | awk '{print $1,substr($4,14,2)}'
15時以降のアクセスにしたければ
grep "-" /var/log/apache2/access.log | awk 'substr($4,14,2)>=15 {print $1}'
ということで、めでたく不等号の登場です。
しかし、自動実行させるシェルスクリプトなので、直接>=15は指定できません。
変数を入れることになります。
TMPTIME="`date --date "1 hour ago" "+%H"`"
という変数を宣言します。毎時0分実行なので、1 hour agoとなります。
しかし、この変数はawkの中では使えません。
awkの変数として宣言をし、最終形として
grep "-" /var/log/apache2/access.log | awk --assign awk_time=${TMPTIME} 'substr($4,14,2)>awk_time {print $1}' | sort | uniq -c
でIPアドレス別の集計がてきます。
まとめたシェルスクリプト
#!/bin/bash
LANG=C
TMPTIME="`date --date "1 hour ago" "+%H"`"
grep "-" /var/log/apache2/access.log | awk --assign awk_time=${TMPTIME} 'substr($4,14,2)>awk_time {print $1}' | sort | uniq -c
結構大変ですが、不等号を使うという発想がこの結果を招いています。
コマンドの勉強にはなりました。
そこで、もう一つ単純な発想で、15時の1時間前は14時、14に等しいものを抽出すればよい。
ログの書式に合わせて変数を定義
TMPTIME="`date --date "1 hour ago" "+%d/%b/%Y:%H"`"
そのまま
grep ${TMPTIME} /var/log/apache2/access.log | awk '{print $1}' | sort | uniq -c
とすればすっきりします。
※コメント投稿者のブログIDはブログ作成者のみに通知されます