ログ監視ツール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

Share

最近の投稿

NetlifyのSplit TestingとFunctionsについて使い方をまとめる Split TestingはGitHubのブランチをベースにしたA/Bテストを行うための機能のことで、FunctionsはNetlifyでAWS Lambdaを使うことができる

NetlifyとはHTMLなどの静的コンテンツのみで構成されたWebサイトを閲覧できる形で配信するWebサービス GitHubやBitbucket、GitLabなどと連携して使うことができて、リポジトリにプッシュすることで自動でCI/CDを行うことができる、無料枠が豊富で独自ドメインを設定可能

WordPressからJekyll(GitHub Pages)に移行した手順をまとめる。 お金的な事情や使いやすさなどの理由で無料のJekyll+GitHub Pagesに移行した。JekyllとはMarkdown等から静的ページを生成する静的サイトジェネレータ

Scala開発のためにScalaらしさをまとめる 言語設計者の設計思想を元にScalaらしさについてまとめる オブジェクト指向と関数型の融合について

StorybookとはUI開発環境を提供するツール React、React Native、Angular、Vueなどをサポートしている ユーザーは独立した開発環境でコンポーネントを個別に作成して挙動の確認をテストできたり、コンポーネントを一覧にしてカタログ化できるので他の人に紹介する時に使えたりする

カテゴリ一覧

タグ一覧