FuelPHP のログを swatch で監視する方法

FuelPHP のログファイルを swatch でリアルタイム監視する方法です。

CentOS 6.3 を前提としています。

swatch のインストール

$ sudo yum install swatch
$ sudo yum install perl-Time-HiRes perl-File-Tail

必要なファイルの準備

epel の swatch パッケージには起動スクリプトが含まれていません。ここでは、FuelPHP 監視用に特化した起動スクリプトなどを用意します。

フォルダの準備
$ sudo mkdir /var/log/swatch
$ sudo mkdir /var/run/swatch
起動スクリプト
$ sudo vi /etc/rc.d/init.d/swatch-fuelphp
#!/bin/sh
#
# swatch-fuelphp  Startup script for Swatch for FuelPHP
#
# chkconfig: 2345 90 35
# description: FuelPHP log watching with Swatch.
# processname: swatch
# config: /etc/swatch/fuelphp/*.swatch
# config: /etc/swatch/fuelphp/*.conf
# pidfile: /var/run/swatch/swatch-fuelphp.*.pid


# Source function library.
. /etc/rc.d/init.d/functions

SWATCH=/usr/bin/swatch
LOCKFILE=/var/lock/subsys/swatch-fuelphp
CONFPATH=/etc/swatch/fuelphp
PROCFILE_PATH=/var/run/swatch
CONFFILE=*.swatch
WORKPATH=/etc/swatch
LOGFILE=/var/log/swatch/swatch-fuelphp.log


start()
{
	RESULT_CODE=0
	
	if [ -f ${LOCKFILE} ]; then
		echo "Swatch for FuelPHP is already running."
		exit 1
	else
		touch ${LOCKFILE}
	fi
	
	PROCCOUNT=0
	
	for CONFIGFILE in ${CONFPATH}/${CONFFILE}
	do
		if [ -f ${CONFIGFILE} ]; then
			PROCCOUNT=`expr ${PROCCOUNT} + 1`
			
			# get the site config file name
			SITECONF="${CONFPATH}/`basename ${CONFIGFILE} .swatch`.conf"
			
			# load the site config
			logfile=""
			if [ -f ${SITECONF} ]; then
				. "${SITECONF}"
			else
				echo "Error: no such file: ${SITECONF}"
				continue
			fi
			
			if [ "X$logfile" = "X" ]; then
				echo "Error: ${SITECONF} has no logfile config"
				continue
			fi
			
			TARGET_LOG=$logfile


			echo -n "Starting Swatch for FuelPHP: ${TARGET_LOG}"
			
			${SWATCH} \
				--config-file ${CONFIGFILE} \
				--tail-file ${TARGET_LOG} \
				--script-dir=${WORKPATH} \
				--daemon \
				--tail-args='--follow=name --retry -n 0' \
				--pid-file ${PROCFILE_PATH}/swatch-fuelphp.${PROCCOUNT}.pid \
					2>> ${LOGFILE}
			
			RETVAL=$?
			echo
			if [ ${RETVAL} != 0 ]; then
				RESULT_CODE=${RETVAL};
			fi
		else
			RESULT_CODE=7
		fi
	done
		
	return ${RESULT_CODE}
}

stop()
{
	if [ -f ${LOCKFILE} ]; then
		for PID in ${PROCFILE_PATH}/swatch-fuelphp.*.pid
		do
			if [ -f ${PID} ]; then
				PID_NUMBER=`cat ${PID}`
				echo -n "Shutting down Swatch for FuelPHP (pid ${PID_NUMBER}): "
				killproc -p ${PID}
				RETVAL=$?
				rm -f ${PID}
				echo
			else
				RETVAL=7
			fi
		done
	fi

	rm -f ${LOCKFILE}
	rm -f ${WORKPATH}/.swatch_script.*

	return ${RETVAL}
}

status()
{
	if [ -f ${LOCKFILE} ]; then
		echo -n "Swatch for FuelPHP (pid :"
		
		for PID in ${PROCFILE_PATH}/swatch-fuelphp.*.pid
		do
			if [ -f ${PID} ]; then
				echo -n " `cat ${PID}`"
			fi
		done
		
		echo ") is running."
	
	else
		echo "Swatch for FuelPHP is stopped."
	fi
	
	return 0
}

case "$1" in
	start)
		start
		RETVAL=$?
		;;
	stop)
		stop
		RETVAL=$?
		;;
	restart)
		stop
		start
		RETVAL=$?
		;;
	status)
		status
		RETVAL=$?
		;;
	*)
		echo "Usage: swatch-fuelphp {start|stop|restart|status}"
		exit 1
esac

exit ${RETVAL}
$ sudo chmod +x /etc/rc.d/init.d/swatch-fuelphp
$ sudo chkconfig swatch-fuelphp on
crontab 設定

FuelPHP のデフォルトではログファイルは日別に作成されますので、毎日 0時 0分にスクリプトを再起動するように crontab に設定します。

$ sudo vi /etc/crontab

以下を追加します。

# swatch for fuelphp
0 0 * * * root service swatch-fuelphp restart

監視設定

準備ができましたので、FuelPHP のサイトの監視設定を作成します。

設定ファイルは /etc/swatch/fuelphp フォルダに配置します。

サイト設定ファイルの作成

「サイト名.conf」としてサイトの設定ファイルを作成します。この設定ファイルでは、FuelPHP のログファイルを定義します。

ここでは、「サイト名」を「fuelphp-site」としています。

$ sudo vi /etc/swatch/fuelphp/fuelphp-site.conf
#!/bin/sh

logfile="/var/www/vhost/www.example.com/fuelphp-site/fuel/app/logs/`date +"%Y/%m/%d"`.php"

#echo $logfile
サイト用の swatch 設定ファイル

そのサイトの swatch の設定ファイルを作成します。ファイル名は「サイト名.swatch」とします。

$ sudo vi /etc/swatch/fuelphp/fuelphp1st-site.swatch
watchfor /Error/
    mail=root@example.com,subject=[fuelphp-site] FuelPHP Error log
    threshold track_by=Error,type=limit,count=1,seconds=60

ここでは、ログに「Error」という文字列が現れた場合、root@example.com 宛に「[fuelphp-site] FuelPHP Error log」という件名のメールを送信するように定義しています。

また、threshold を指定して、Error が何度発生しても 60秒間には最初の 1回しかメールを送信しないよう指定しています。

これで準備完了です。


監視を開始します。

$ sudo service swatch-fuelphp start