Help us understand the problem. What is going on with this article?

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 でかんたんにログ監視

takeshy
現在の関心 SPA Backbone.js Node.js rails スペイン語
https://github.com/takeshy
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away