Amazon EC2でリアルタイムにログ監視をする – logmon –

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ログ監視とは

皆さん、ログ監視をどのように行っていますか?行っていない?たまにログインして目視チェックとか、何かトラブったらチェックとか。どうしてもアクションが遅くなってしまって何気に困っていませんでしょうか。そこで出てくるのがリアルタイム/定期的にログを監視してアクションする/アクションを促す仕組みです。

swatchとは

swatchは、Linux環境で昔から使われているリアルタイムにログを監視する仕組みです。特定のログファイルの追記に対してリアルタイムに監視をして、パターン文字列に合致したらアクションを行ってくれます。とりあえず1つのログファイルを監視するだけでしたらこの仕組みで十分かもしれません。しかし、Apache、Tomcat、Syslog等の複数のログファイルを監視したい場合、複数のプロセスを起動する必要があるため、もっと良い方法は無いかなと思っていました。

logmonとは

logmonは、1つのプロセスで複数のログファイルをリアルタイムに監視する仕組みです。Perlスクリプトとして公開されていますのでカスタマイズして使う事もできます。今回は、logmonを用いて動作確認を行いたいと思います。まずはインストールから。ダウンロード直リンクからだとエラーとなってしまいますので、テキストブラウザを用います。ダウンロード後にsetup.shを実行すれば必要なファイルをコピーしてサービス登録まで行ってくれます。

$ sudo yum install w3m
$ w3m http://www-06.ibm.com/jp/domino01/mkt/cnpages7.nsf/page/default-00057580
$ tar zxvf logmon_20100411.tgz 
$ cd logmon_20100411
$ sudo ./setup.sh
+ mkdir -p /etc/logmon
+ cp ./logmon.pl /etc/logmon/
+ cp ./logmon.conf /etc/logmon/
+ cp ./logmon /etc/init.d/logmon
+ chmod 700 /etc/init.d/logmon
+ chmod 700 /etc/logmon/logmon.pl
+ chmod 600 /etc/logmon/logmon.conf
+ chkconfig --add logmon
+ chkconfig --level 345 logmon on

リモートログインを監視する

まずは分かりやすいところから監視してみましょう。sshでログインに成功するとログを出します。

$ sudo vi /etc/logmon/logmon.conf

設定ファイルの書式は、1行目に監視対象のログ名、2行目に監視文字列、3行名にアクションです。この例では、/var/log/secureを監視して、Accepted publickey forという文字列が追記されたら、echoコマンドを実行しています。

:/var/log/secure
(Accepted publickey for)
echo "<%%%%>" >> /home/ec2-user/logoutput.txt

設定を書き終わったらサービスを再起動します。設定が正しいかもチェックしましょう。1つの設定ファイルに複数の監視項目を設定できますので一元管理が出来て便利ですね。

$ sudo service logmon restart
$ sudo service logmon check

SSHコンソールからログアウトして、再度ログインしてみましょう。指定のログに書き出されているはずです。

$ tail logoutput.txt 
Mar 25 10:12:27 ip-10-146-XXX-XXX sshd[20363]: Accepted publickey for ec2-user from 49.132.XXX.XXX port 55493 ssh2

Tomcatのログ監視をする

Tomcatのログを監視してみます。Log4jが吐き出すヘッダや、例外出力があった場合に検出するようにしています。今回は確認用にログを出していますが、メール通知やシェル実行、CloudWatch連携を行うなど応用ができます。

:/var/log/tomcat6/catalina.out
(Exception|Error|Warn|Fatal)
echo "<%%%%>" >> /home/ec2-user/logoutput.txt

ログローテーションに対応する

Apache等のログはローテーションしていますので、これに対応します。取り扱い説明書には、logrotate関連のファイルに対する修正が必要と書いてありましたが、監視するファイル毎に修正するのは面倒なので何か良い方法が無いかと探していました。そこで、発見したのがスクリプト自体の1文字修正。裏技的ですがこれでローテーション設定ファイルを修正せずに監視ができます。

$ sudo vi /etc/logmon/logmon.pl 

tailを呼び出している部分の引数を-fから-Fに変更します。

open ( IN, "tail -n$tail_num -f $target|" );

これを以下のようにします。

open ( IN, "tail -n$tail_num -F $target|" );

まとめ

logmonによるリアルタイムなログ監視についていかがでしたでしょうか。中身はLinuxの基本的なコマンドであるtailによって追加された行に一致検索を掛けているperlスクリプトというシンプルなものでした。シンプルではありますが、複数のログファイルをまとめて監視することができ、それぞれアクションを指定することができるというパワフルなものです。リアルタイムな処理というとCPUリソースを多く使ってしまうことを連想しますが、負荷も少なく実用的なスクリプトかと思います。今日から君もログを監視するアクションスターだ!

参考資料

IBM Systems Director で利用できるログファイル監視用スクリプト

一文字パッチでlogmonをログローテートに対応させる

tail ファイルの最終部分を表示 (パイプ)

ログ監視ツールをswatchからlogmonに切り替えた