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

■ 目次

  1. 概要
  2. 導入
  3. 使い方
  4. echo

■ 概要

サーバのログを監視する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

Be First to Comment

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です