incronを使ってseekファイルリセット

ログ監視を行う場合に必要なseekファイルのお話

logrotateを使わずアプリケーション側でローテーションしていると…
・ローテーションした際にリセット処理を入れることができない

更に、日付が変わってすぐにローテーションではなく、アクセスがあってからログが生成されると…
・seekファイルをリセットするタイミングが分からない

更に更に、ファイルサイズでローテーションする場合…
・もう完全にseekファイルをリセットするタイミングが分からない

ということでincronを使ってファイルの生成や変更時にスクリプトを叩くよう設定

incronのインストール
リポジトリはrpmforge

# yum install incron
# /etc/init.d/incrond start
# chkconfig incrond on

テスト用スクリプト

# cat /tmp/echo-date.sh
#!/bin/bash
echo `date` >> /tmp/incrond.log
# chmod +x /tmp/echo-date.sh

incronの設定

# incrontab -e
/tmp/ IN_CREATE /tmp/echo-date.sh
# incrontab -d

テスト

# touch /tmp/testfile

/tmp/incrond.logに日付が入力されていることを確認

複数ログを引数で渡す場合は「””」で囲まずバックスラッシュを入れる
※同じディレクトリを複数行設定できない?

/tmp/ IN_CREATE /tmp/echo-date.sh /path/to/1.log /path/to/2.log /path/to/1.log 

seekファイルをリセットするスクリプトは
「スクリプト実行時にローテーションされていた場合にseekファイルリセット」
の処理をすればOK

今回は下記スクリプトを作成

#!/bin/bash
##########################
# Seek File Reset Script #
##########################

if [[ ${#} < 1 ]]; then
  echo "Usage: ./`basename ${0}` /path/to/log"
  exit 1
fi

LOGLIST=${1}
DIR="/etc/nagios/kanshi"

for LOGPATH in ${LOGLIST}
do
  LOGFILE=`basename ${LOGPATH}`

  HEADFILE="${LOGFILE}.head"
  SEEKFILE="${LOGFILE}-*.seek"

  MD5=`head -n 1 ${LOGPATH} | md5sum | awk '{print $1}'`
  HEAD=`cat ${DIR}/${HEADFILE}`

  if [[ ${MD5} != ${HEAD} ]]; then
    /bin/rm ${DIR}/${SEEKFILE}
    echo ${MD5} > ${DIR}/${HEADFILE}

#debug
#    export LANG=en
#    echo "`date`: Reset ${DIR}/${SEEKFILE}" >> /var/log/seek-reset-incron.log
#gubed
  fi
done

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中