概要
サーバのログを監視する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
テストモードで実行
マッチした行が出力されているのがわかる
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
コメントを書く
コメント一覧