◆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参照