Apacheを使用しているWebシステムやWebサイトで、本格的なログ分析前に、エラー出ているのかを簡単にチェックする方法。私はパイプで抽出ログを自分にメール送信して、アラート代わりに使っています。
ステータスコード400以上の行を抽出する方法
awkを使い、以下のように抽出します。
$9 と $7 を両方チェックしているのは、以下の408エラーのように、エラー以外の情報が入っていないログがあるため。
123.123.123.123 – – [24/Sep/2013:12:14:06 +0900] “GET /some/prog.cgi HTTP/1.1” 500 1024 “http://www.referer.com” “Browser Info”
エラーのメールアラートのためのコマンド
実務上は、既知のエラーで無視するもの(自分の担当ディレクトリ外の画像の404エラーなど)を grep -v ではじいてから抽出、結果をパイプでメールします。cronで実行しておくようにするとヘルスチェックにもなって便利です。
| awk ‘($9 >= 400 || $7 >= 400) {print $0 }’ \
| mail -s “Log Check Result” me@some.domain.jp
ログがリモートサーバにある時のFTP付きシェルスクリプト
ログを取っているWebサーバで直接cronが実行できない場合は、自分のサーバでcronでシェルスクリプトを実行し、FTPなどで落としてきてから同じ事を行います。
(小規模Web開発ばかりをやっていると、お客様指定のサーバでFTPしかアクセスできない、sshは当然×、cronもダメ、というサーバが結構あります。)
#Webサーバログチェック
WORKDIR=/path/to/logcheck
DATE=`date +%Y%m%d%H%M`
cd $WORKDIR
if [ -f access_log ]; then
mv access_log access_log.bak.$DATE
#問題が出ない事が多いならどんどん消してしまっても良い。
#後で見直す事があるので、私は1ヶ月くらい経ってから手動でまとめて消しています。
fi
cat $WORKDIR/ftpcommand.txt | ftp
if [ -s access_log ]; then
egrep -v “GET /(images|common|favicon.ico|apple-touch-icon-)” access_log \
| awk ‘($9 >= 400 || $7 >= 400) {print $0 }’ \
| mail -s “Log Check Result” me@some.domain.jp
fi
「cat $WORKDIR/ftpcommand.txt | ftp」部分のFTPの自動化について詳しくはこちら。