Edited at

logmon-goで簡単ログ監視

More than 3 years have passed since last update.


概要

logmonというファイルを監視し、正規表現で指定した文字パターンが現われると、指定したコマンドが実行できるツールがあります。

設定が簡単で、100行ちょっとのスクリプトという手軽さなので、いろいろなサーバ上でエラーを検出するとその内容をメールで通知するツールとして使っていました。

ただ使っている内に下記の問題点がありました。


  1. パターンに一致した行しかコマンドに送ることができないため、エラー行の後にスタックトレースが表示されるようなログの場合は、スタックトレースをコマンドに渡せない。

  2. 指定したパターンに一致してても、コマンド実行の対象外としたい文字列があった場合に、除外指定ができない。

そこで新たに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


参照

logmon-go

logmon でかんたんにログ監視