Apacheのログからエラーアクセスだけ抽出


Apacheを使用しているWebシステムやWebサイトで、本格的なログ分析前に、エラー出ているのかを簡単にチェックする方法。私はパイプで抽出ログを自分にメール送信して、アラート代わりに使っています。

ステータスコード400以上の行を抽出する方法

awkを使い、以下のように抽出します。

awk '($9 >= 400 || $7 >= 400) {print $0 }' access_log

$9 と $7 を両方チェックしているのは、以下の408エラーのように、エラー以外の情報が入っていないログがあるため。

123.123.123.123 - - [24/Sep/2013:11:46:23 +0900] "-" 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で実行しておくようにするとヘルスチェックにもなって便利です。

egrep -v "GET /(images|common)" access_log \
| 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もダメ、というサーバが結構あります。)

#!/bin/sh

#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の自動化について詳しくはこちら