ログ監視ツールSwatchを試してみる

Published: 2016年10月9日 by tomsato

概要

サーバのログを監視するSwatchについて調べる

例えばApacheのログに「PHP Fatal error」が出力された場合にメール送信や任意のスクリプトを実行するなど何かを行いたいという時に使うツール

導入

導入環境

$ cat /etc/redhat-release
CentOS release 6.8 (Final)

Swatchを入れる

$ sudo yum --enablerepo=epel -y install swatch

使い方

Swatchを実行するにはアクションが記述された設定ファイルが必要
Swatchの構文について

watchfor 検索パターン
  アクション1
  アクション2
  アクション3
  ...

watchfor   /PHP Fatal error/
    # 「PHP Fatal error」にマッチした行を赤文字で出力
    echo red

上記の例ではアクションにはechoを使っているが他にも色々ある
使いそうなものを抜粋

  • echo:ターミナルにメッセージを出力
  • exec:指定した任意のコマンドを実行する
  • mail:メールを送信する
  • pipe:パイプでコマンドに結果を渡す
  • threshold:マッチしたログが出るたびにアクションをしないように間引くことができる

設定ファイルを用意した状態でswatchコマンドによってログ監視をスタートする

echo

とりあえず試しに触ってみるためアクション:echoを使ってマッチした行をコンソールに出力させる
設定ファイルの準備

$ sudo mkdir /etc/swatch
$ cat /etc/swatch/swatch.conf
watchfor   /PHP Fatal error/
    # 「PHP Fatal error」にマッチした行を赤文字で出力
    echo red
watchfor   /.*/
    # それ以外の行を表示する
    echo

ログファイルの準備

// 適当に文字列を書いただけ
$ cat /tmp/error_log
PHP Fatal error aaa
hogehoge

テストモードで実行
swatch01
マッチした行が出力されているのがわかる

exec

マッチした場合に任意のスクリプトを実行するアクション:execを試す
設定ファイル

$ cat /etc/swatch/exec.conf
watchfor   /PHP Fatal error/
    # execで任意のスクリプトを実行できる
    # 引数としてマッチしたログの行を渡している
    exec /tmp/test.sh "$_"

スクリプト

$ cat /tmp/test.sh
#!/bin/sh
echo --- $1 ---

$ chmod 755 /tmp/test.sh

実行する

$ sudo swatch -c /etc/swatch/exec.conf -f /tmp/error_log

*** swatch version 3.2.3 (pid:9972) started at Sun Oct  9 09:31:09 UTC 2016

--- PHP Fatal error aaa ---

シェルスクリプトが実行されていることがわかる

threshold

アクション:thresholdを使って間引き設定を行う
設定ファイル

$ cat /etc/swatch/threshold.conf
watchfor   /PHP Fatal error/
    # execで任意のスクリプトを実行できる
    # 引数としてマッチしたログの行を渡している
    exec /tmp/test.sh "$_"

    # thresholdは同じログが何度も出てくる場合に間引き設定をすることができる
    # type bothを指定した場合、interval(今回は10秒)の間にcount(今回は3)回マッチしたら上のexecが実行される
    # その後はintervalが切れてcountがリセットされるまでexecは実行されない
    threshold track_by=/PHP Fatal error/, type=both, count=3, seconds=10

間引きのテストをするためログファイルの中身を空にする

$ wc -l /tmp/error_log
0 /tmp/error_log

実行する

$ sudo swatch -c /etc/swatch/threshold.conf -t /tmp/error_log

*** swatch version 3.2.3 (pid:907) started at Sun Oct  9 07:02:08 UTC 2016

この間にログを出力させる

$ sudo bash -c "echo PHP Fatal error >> /tmp/error_log"
$ sudo bash -c "echo PHP Fatal error >> /tmp/error_log"
$ sudo bash -c "echo PHP Fatal error >> /tmp/error_log"

3回実行したところでswatchが「— PHP Fatal error —」と吐き出すはず

Swatchの起動スクリプトを作成する

サーバが再起動した時に自動起動するように設定する

$ cat /etc/init.d/swatch
#!/bin/bash

# chkconfig: 2345 90 35
# description: swatch start/stop script

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

mkdir -p /var/run/swatch
mkdir -p /var/log/swatch

PIDFILE=/var/run/swatch/swatch.pid
LOCKFILE=/var/lock/subsys/swatch
PROGCOM="/usr/bin/swatch --pid-file $PIDFILE -c /etc/swatch/swatch.conf -t /tmp/error_log >> /var/log/swatch/swatch.log 2>&1 &"

[ -f /usr/bin/swatch ] || exit 0

start() {
    ls $PIDFILE > /dev/null 2>&1
    if [ $? -ne 0 ]; then
        touch $LOCKFILE
        echo -n "Starting Swatch: "
        daemon $PROGCOM
        echo
    else
        echo "swatch is already started"
    fi
}
stop() {
    ls $PIDFILE > /dev/null 2>&1
    if [ $? -eq 0 ]; then
        echo -n "Stopping swatch:"
        killproc swatch
        echo
        rm -f $PIDFILE $LOCKFILE
    else
        echo "swatch is not running"
    fi
}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        stop
        start
        ;;
    status)
        status -p $PIDFILE -l $LOCKFILE swatch
        ;;
    *)
        echo "Usage: swatch {start|stop|restart|status}"
        exit 1
esac
exit 0

このようにすることでstart/stopでswatchが起動することができる

// 操作方法
$ sudo /etc/init.d/swatch start
Starting Swatch:                                           [  OK  ]
$ sudo /etc/init.d/swatch status
swatch (pid  10067) is running...
$ sudo /etc/init.d/swatch stop
Stopping swatch:                                           [  OK  ]

自動起動の設定

$ sudo chkconfig --add swatch
$ sudo chkconfig swatch on

コメントを書く

※ 個別に返信が必要な時のみご記入ください

※ Emailは公開されません

※ 承認されると名前・コメントが下記に表示されます

コメント一覧

最近の投稿

ビジュアルリグレッションテストについてまとめ、ネットで調べると数多くのライブラリがありどれがどんな立ち位置なのか全体像がわかりずらかったのでどんな種類があるのか入門の入門としてまとめます、またPlaywrightを使って実際に触ってみました

社内ツールなどの超小規模なAPIをGolangで実装する際にフレームワークを使うべきかを、実際にnet/httpを使った実装とフレームワークを使った実装を比較することでどれだけ優位性があるかを見ていきたいと思います。今回はフレームワークにはシンプルで使いやすそうなEchoを使うことにします。

vue-pdfを使ってNuxt.jsで作成しているアプリケーションに pdfスライドを表示させるサンプルを作成しました README.md通りに実装してもうまくいかないところがあったのでそのあたり含めてまとめます

Vue.js / Nuxt.jsにおけるログインの実装方法をまとめる Auth0やNuxt.jsのAuth Moduleとmiddlewareについて調べつつサンプルを作成することで理解を深める

コンポーネント設計について考える Atomic DesignやPresentational Component, Container Componentについてまとめつつ 自分だったらVue.js / Nuxt.jsでどういうコンポーネント設計にするかについてまとめます

カテゴリ一覧

タグ一覧