nginxのアクセス数を集計するプラグイン

Mar 27, 2012   #つれづれ  :

muninでnginxのアクセス数を集計するプラグインを作成してみました。

やりたいこと

nginxのログファイルからお手軽にアクセス数を集計したい。

muninプラグインの仕様

  • configという引数を与えられると、muninのconfigを標準出力に出力する
  • 引数なしの場合には、「属性名 数値」を出力する
  • 5分毎に呼び出される

詳細は HowToWritePlugins ? Munin を参照のこと。

nginxのログの仕様

  • 1アクセスが1行のログとして書き込まれる
  • (私の場合は)24hごとにログがローテーションする

デザイン

  • 1アクセスが1行のログとして書き込まれることから、wcコマンドで行数をカウントすればよさそう。この時点でシェルスクリプトで作成することに決定
  • 直前にスクリプトを実行した際の行数と、現在の行数をカウントして、その差がアクセス数
  • ローテーションした場合には「現在の行数」< 「直前にスクリプトを実行した際の行数」の時。この時はアクセス数は0とする。次回の起動時にアクセス数としてカウントする。

作成したスクリプト

#!/bin/bash
# -----------
# varibales
# -----------
LOGFILE="/var/log/nginx/front_proxy.access.log"
LASTDATA="/tmp/.munin-nginx"
# -----------------------
# Handling the arguments
# -----------------------
case $1 in
config)
cat <<'EOM'
graph_args -l 0
graph_scale no
graph_category nginx
graph_title Nginx Access
graph_vlabel access
access.label access
EOM
exit ;;
esac
# -----------------------
# Collecting data
# -----------------------
CURRENT_LINENUM=`wc -l ${LOGFILE} | perl -pe "s/^ +//" | cut -f 1 -d " "`
# checks if the last recorded data exists or not:
if [ -e ${LASTDATA} ]; then
 # Get the last line number
LASTLINE=`cat ${LASTDATA}`
expr ${CURRENT_LINENUM} \< ${LASTLINE} > /dev/null
RESULT=$?
 # when the target log file is rotated,
if [ $RESULT -eq  ]; then
 # it returns 0
echo "access.value 0"
 # and sets 0 to the $LASTDATA
echo 0 > ${LASTDATA}
 # not rotated
else
echo -n "access.value "
echo `expr ${CURRENT_LINENUM} - ${LASTLINE}`
echo ${CURRENT_LINENUM} > ${LASTDATA}
fi
else
 # if the log file does not exist, it returns 0
echo "access.value 0"
 # and sets the current line number to the $LASTDATA
echo ${CURRENT_LINENUM} > ${LASTDATA}
fi
exit