#概要
logmonというファイルを監視し、正規表現で指定した文字パターンが現われると、指定したコマンドが実行できるツールがあります。
設定が簡単で、100行ちょっとのスクリプトという手軽さなので、いろいろなサーバ上でエラーを検出するとその内容をメールで通知するツールとして使っていました。
ただ使っている内に下記の問題点がありました。
- パターンに一致した行しかコマンドに送ることができないため、エラー行の後にスタックトレースが表示されるようなログの場合は、スタックトレースをコマンドに渡せない。
- 指定したパターンに一致してても、コマンド実行の対象外としたい文字列があった場合に、除外指定ができない。
そこで新たにGo言語で実装し、上記も対応できるよう実装しました。
go getできるサーバが1台あれば、同じOS環境のマシンに対してバイナリを置くだけで簡単にインストールすることが可能です。
実行
foregroundで実行
1.go getでインストール
go get github.com/takeshy/logmon-go
2.実行(設定ファイルについては後述)
#設定の確認のみ
logmon-go -f 設定ファイルのパス -c
#実行
logmon-go -f 設定ファイルのパス
デーモンとして実行
1.実行ファイルを各サーバの/usr/local/binに配置
scp $GOPATH/bin/logmon-go サーバ:/usr/local/bin
2.起動スクリプトを記述
touch /etc/init.d/logmon
chmod +x /etc/init.d/logmon
vi /etc/init.d/logmon
/etc/init.d/logmon
#!/bin/sh
LOGMON_CONF=/etc/logmon/logmon.conf
LOGMON_BIN=/usr/local/bin/logmon-go
logmon_opts="-f $LOGMON_CONF"
check_start() {
$0 status > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo "Success."
exit 0
fi
echo "Failed."
exit 1
}
case "$1" in
start)
$0 status > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo "logmon is alredy running."
exit 1
fi
echo -n $"Starting logmon: "
$LOGMON_BIN $logmon_opts >/dev/null 2>&1 &
sleep 1
check_start
;;
stop)
echo -n "Stopping logmon: "
pkill -TERM -of $LOGMON_BIN
echo Done.
;;
restart)
$0 stop
sleep 1
$0 start
;;
check)
$LOGMON_BIN -c $logmon_opts
;;
status)
pid=`pgrep -of $LOGMON_BIN`
if [ -n "$pid" ]; then
echo "logmon (pid $pid) is running..."
exit 0
fi
echo "logmon is stopped"
exit 3
;;
*)
echo "Usage: $0 {start|stop|restart|status|check}"
exit 1
esac
3.設定ファイルを記述(設定ファイルについては後述)
vi /etc/logmon/logmon.conf
4.実行
/etc/init.d/logmon start
設定ファイルについて
logmonの設定ファイルの設定に監視対象除外Regexpと待機ミリ秒の設定を追加したもの。監視対象除外Regexpと待機ミリ秒の設定はオプションのため、既存のlogmonの設定がそのまま使えるはず。
/etc/logmon/logmon.conf
#監視ファイルパス :を先頭につける必要
:/var/log/nginx/error.log
#監視対象のRegexp ()で囲む必要
(ERROR|Error)
#監視対象除外Regexp []で囲む必要。指定しなくてもよい
[SSL_BYTES_TO_CIPHER_LIST]
#この指定ミリ秒数の間、一致行に続く出力文字列をつけ加える。{}で囲む必要。指定しなくてもよい
{1000}
#監視対象Regexpにマッチかつ監視対象外Regexpにマッチしなかった場合に実行されるコマンド.
#<%%%%>は一致した文字列に置き換えられる。
#<%%%%>を含む箇所は意図せぬ展開を防ぐため'(シングルクォート)で囲む
echo '<%%%%>' | mail -s "nginx error" takeshy
#複数監視ファイルがある場合は上記を繰り替えす
:/var/www/app/shared/log/unicorn.log
(ERROR|FATAL)
echo '<%%%%>' | mail -s "unicorn error" takeshy