【メモ】swatchを使ったリアルタイムなログ監視@今時の環境

【メモ】swatchを使ったリアルタイムなログ監視@今時の環境 はてなブックマーク - 【メモ】swatchを使ったリアルタイムなログ監視@今時の環境


◆linuxのリアルタイムなログ監視と、メール通知のシンプルな方法

swatch (Simple Log Watcher)は、古くからあるリアルタイムにログを監視するツールです。tailコマンドを拡張したようなイメージで、特定の文字列がある行を強調したり、色をつけるほか、メールを送信したり任意のコマンドを実行することもできます。

久々に使う機会が出て、少しはまった所があったので、自分のφ(..)メモメモ

◆swatch

linuxで、リアルタイムにログを監視する方法といえば、tail コマンドの出番が定番でしょう。tail に -f オプションをつけて、画面を眺める手法。古くからも、そして現在でも一般的に通用する手法だと思います。

ただ、tail -f に弱点があるとすると、

  • リアルタイムで人間が画面に張り付かなくてはいかない点
  • ログが増えすぎると、目で追えなくなる点

どうしても、人間の属人的能力が求められてしまいます。

そこで登場するのが便利なツールが swatch です(本当は、LogMonとかLogsurferとか色々便利そうですが、今回は敢えてレガシーのswatchを取り上げます。ハマったのがちょっと悔しくて)。

◆セットアップ方法

swatchは、Perlで書かれたスクリプトです。セットアップもあまり環境に依存せず、比較的手軽にインストールできます。

RHEL系ならEPELにパッケージがありますので、

# yum -y install swatch

これでサクッと入ります。

ソースからの場合は、SourceForgeからファイルを拾ってきて展開します。

$ wget http://downloads.sourceforge.net/project/swatch/swatch/3.2.3/swatch-3.2.3.tar.gz
$ tar xvfz swatch-3.2.3.tar.gz
$ cd swatch-3.2.3
$ perl Makefile.PL
$ make
$ make test
# make install

なお、make test で失敗するときは、いくつか Perl のモジュールが足りません。

$ make test
PERL_DL_NONLAZY=1 /usr/bin/perl "-MExtUtils::Command::MM" "-e" "test
 _harness(0, 'blib/lib', 'blib/arch')" t/*.t
t/01cpan_modules.t .. Can't locate File/Tail.pm in @INC

もしも不幸にも「xxx.pm」が無いと表示された場合は、「cpan -i File::Tail」を実行するなどして、サクッとモジュールをセットアップすると幸せです。

make install が終わると「/usr/bin/swatch」にファイルが置かれます。

◆実行してみる

実際に使う前に、「ログファイルの何を監視するか」を定義する必要があります。これは正規表現で一致する文字が出たとき、特定のコマンドを実行するという指定です。

この設定ファイルのパスは、デフォルトでは ~/.swatch です。

たとえば /var/log/secure ファイルを監視対象と仮定します。このなかで「su:」で始まる文字列を赤色で表示したい場合は、次のように記述します。

watchfor   /su:/
 color red
watchfor   /.*/
 echo

// で囲まれた所が、一致する文字列パターンの指定です。

後ろ2行は、普通の tail 同様、画面に表示させる指定です。逆にこの2行がなければ、”su:”が含まれる行しか表示されません。

さて、では、定義ファイルを用意したところで実際にコマンドを走らせます。swatchにはリアルタイムで参照するtailモードの他、テストモードも存在します。細かいオプションは、man swatch で確認できます。

--tail-file=filename or -t filename
 Examine lines of text as they are added to filename.

 --read-pipe=command or -p command
 Examine input piped in from the command.

 --examine=filename or -f filename
 Use filename as the file to examine.  Swatch will do a single pass
 through the named file.

テストモードが “-f ファイル名”であるのに対し、通常のログ監視は “-t  ファイル名”であることがわかります。また、設定ファイルは “-c” オプションで指定します。

ホームディレクトリの .swatchrc を使って、/var/log/secure を監視する場合は、次のように実行します。

# swatch -c ./.swatchrc -t /var/log/secure

◆メールを送信するには

特定条件をトリガとしてメールを送信するには、「mail」という指定が可能です。

watchfor        /su:/
    echo red
    mail addresses=zem\@pocketstudio.jp,subject="[node3 alert]"
    throttle 00:10:00

ここで注するのは、メールアドレスの@です。Perlなので、\@としてエスケープしなくてはいけません。throttleは、次にメールを送るときの間隔です(ログが頻出する場合、これが無いとアラートメールの波に襲われます)。

テストは、suコマンドを実行すると確実です。画面には文字列が赤色で表示されつつ、メールが送信されます。

ただ、これではログアウトしてしまうとプロセスが止まります。通常は –daemon オプションを付与し、常駐させておくのが良いでしょう。

# swatch -c ./.swatchrc -t /var/log/secure --daemon

◆sendmailの場合はハマる

で、問題なのはメール送信。リアルタイムでログを監視しているんだから、メールもリアルタイムで送信されるはずッ…そう思っていた時期が私にもありました。

近頃のsendmail 8.13以降では、リアルタイムではメールが送られません。正確には、直ちに送信はされず、ローカルのキューに保管されます。そして一定期間後(RHELのsendmailでは、1時間に1回)に送信されます。以前の古いバージョンであれば、直ちに送信されたのですが、sendmailの仕様変更による影響を受けているものと思います。

この現象は開発メーリングリストでも報告されているのですが、誰も何も反応がなく、事実上放置されている模様です。。

回避するには、Swatch::Actives モジュールの改変が必要です。RHEL5であれば、

# vi  /usr/lib/perl5/vendor_perl/5.8.8/Swatch/Actions.pm

このようにファイルを開き、

$args{'MAILER'} .= ' -oi -t -odq';

この行をから「-odq」の項目を削除します。

$args{'MAILER'} .= ' -oi -t';

コマンドを実行しなおすか、デーモンで起動しているものは停止・再起動することで、以後、条件に一致したら、すぐにメールが送られるようになります。

ちなみに、複数台な環境や、スケールする前提であればswatchよりも、fluentdなどを組み合わせた方法が今時かもしれませんね。このあたり、正直な所、まだ取り組み始めたばかりなのですが、勉強しながら、皆さんと共有できる所はオープンにしてきたいなと思っています( ^ω^)

◆参照

アーカイブ付属のREADMEおよびINSTALL参照