daemontoolsでログ管理(multilog)

ここでは、qmailの作者であるD. J. Bernstein氏作のサービスの起動を行うツールdaemontoolsで管理下のサービスのログの取得方法について説明します。
既に daemontoolsのインストール / daemontoolsからサービス起動方法 が完了しているものとして説明しています。

ログ取得プログラムについて(multilog)

daemontoolsでログ取得するにはmultilogを利用します。
multilogとは 管理しているサービスのログを取得する利用するプログラムでdaemontoolsをインストールすると/usr/local/bin/multilogにインストールされています。

multilogの設定

multilogの設定の大きな流れは以下の通りになります。

(1) /var/supervise/サービス名/以下にログを取得するディレクトリ(log/main)を作成する。
(2) /var/supervise/サービス名/log/以下にmultilogを起動するrunスクリプトを設置する。
(3) /var/service/以下に作成した サービスを管理するディレクトリのシンボリックリンクを張る。

といった手順になります。
では実際に実際にqmail(qmailで apop の実装)を例にとって説明します。
※既にdaemontoolsで起動しているものとして想定して説明しますので起動方法は daemontoolsからサービス起動方法 を参照下さい。

(1) smtpサーバの設定

現在daemontools経由で起動しているスクリプトを停止します。

# rm /var/service/smtp
# svc -dx /var/supervise/smtp

サービスを管理するディレクトリ以下にログを取得ディレクトリ作成します。

# cd /var/supervise/smtp
# mkdir -p log/main

multlogの起動runスクリプトを/var/supervise/smtp/log/run作成します。
スクリプトは以下の用になります。

#!/bin/sh
exec env - PATH="/var/qmail/bin:/sbin:/bin:/usr/sbin:/usr/bin: \
/usr/local/sbin:/usr/local/bin" \
multilog t ./main

最後の ./main はログを格納するディレクトリを指します。
作成したスクリプトに実行権を与えます。

# chmod 755 /var/supervise/smtp/log/run

サービスディレクトリに対して、シンボリックリンクを作成します。

# ln -s /var/supervise/smtp /var/service/smtp

これで問題なければ、自動的に起動用のrunスクリプトとログ取得用のrunスクリプトが起動します。
svstatコマンドでサービスの起動状況を確認してください。

# svstat /var/service/smtp /var/service/smtp/log
/var/service/smtp: up (pid 6540) 568 seconds
/var/service/smtp/log: up (pid 597) 968 seconds

と表示されれば問題ないでしょう。up時間が0や1秒でプロセスIDが変わる場合はスクリプトに誤りがある場合があります。再度runスクリプトの確認をしてください。

(2) popの設定

現在daemontools経由で起動しているスクリプトを停止します。

# rm /var/service/pop
# svc -dx /var/supervise/pop

サービスを管理するディレクトリ以下にログを取得ディレクトリ作成します。

# cd /var/supervise/pop
# mkdir -p log/main

multlogの起動runスクリプトを/var/supervise/pop/log/run作成します。
スクリプトは以下の用になります。

#!/bin/sh
exec env - PATH="/var/qmail/bin:/sbin:/bin:/usr/sbin:/usr/bin: \
/usr/local/sbin:/usr/local/bin" \
multilog t ./main

最後の ./main はログを格納するディレクトリを指します。
作成したスクリプトに実行権を与えます。

# chmod 755 /var/supervise/pop/log/run

サービスディレクトリに対して、シンボリックリンクを作成します。

# ln -s /var/supervise/pop /var/service/pop

これで問題なければ、自動的に起動用のrunスクリプトとログ取得用のrunスクリプトが起動します。
svstatコマンドでサービスの起動状況を確認してください。

# svstat /var/service/pop /var/service/pop/log
/var/service/pop: up (pid 6540) 568 seconds
/var/service/pop/log: up (pid 597) 968 seconds

と表示されれば問題ないでしょう。up時間が0や1秒でプロセスIDが変わる場合はスクリプトに誤りがある場合があります。再度runスクリプトの確認をしてください。

(3) qmailの設定

現在daemontools経由で起動しているスクリプトを停止します。

# rm /var/service/qmail
# svc -dx /var/supervise/qmail

サービスを管理するディレクトリ以下にログを取得ディレクトリ作成します。

# cd /var/supervise/qmail
# mkdir -p log/main

multlogの起動runスクリプトを/var/supervise/qmail/log/run作成します。
qmail自身の実行ユーザがrootではないのでmultilogでも一工夫必要になります。スクリプトは以下の通りです。

#!/bin/sh
exec env - PATH="/var/qmail/bin:/sbin:/bin:/usr/sbin:/usr/bin: \
/usr/local/sbin:/usr/local/bin" \
setuidgid qmails multilog t ./main

setuidgidでqmailsと指定し、qmailsのUID/GIDで実行することになります。
作成したスクリプトに実行権を与えまた、logディレクトリもqmailsの権限へ変更する必要がでてきます。

# chmod 755 /var/supervise/qmail/log/run
# chown -R qmails:qmail /var/supervise/qmail/log/

また、qmailの起動スクリプトはsploggerでsyslogにログを出していました。最後の行の"splogger qmail"という記述を削除し以下の様に設定して下さい。
/var/supervise/qmail/run

#!/bin/sh

# Using splogger to send the log through syslog.
# Using qmail-local to deliver messages to ~/Mailbox by default.

exec env - PATH="/usr/local/qmail/bin:$PATH" \
qmail-start ./Maildir/

サービスディレクトリに対して、シンボリックリンクを作成します。

# ln -s /var/supervise/qmail /var/service/qmail

これで問題なければ、自動的に起動用のrunスクリプトとログ取得用のrunスクリプトが起動します。
svstatコマンドでサービスの起動状況を確認してください。

# svstat /var/service/qmail /var/service/qmail/log
/var/service/qmail: up (pid 6540) 568 seconds
/var/service/qmail/log: up (pid 597) 968 seconds

と表示されれば問題ないでしょう。up時間が0や1秒でプロセスIDが変わる場合はスクリプトに誤りがある場合があります。再度runスクリプトの確認をしてください。

ログの見方

multilogでログを取得するとmain/以下にcurrentというログがたまります。

しかし中身をみると

@4000000040cebb173743e93c delivery 431: success: did_0+0+1/
@4000000040cebb173746bbe4 status: local 0/10 remote 0/20

といったようにタイムスタンプが訳分かりません。これはTAI64形式とうもので人間がわかりやすいようにみるには以下のコマンドを実行しましょう。

# tai64nlocal < current
2004-06-15 18:02:05.927197500 delivery 431: success: did_0+0+1/
2004-06-15 18:02:05.927382500 status: local 0/10 remote 0/20

これで見やすくなりますね。(^^;

multilogのオプション

また、参考までにmultilogのオプションは以下の様なものがあります。

tTAI64N形式のスタンプをログにつける
-patternpatternにマッチした行を出力しない
+patternpatternにマッチしたログを出力する
ssizeログファイルのサイズをsize以下にする(デフォルト99999byte)
nnumログの世代数をnum世代にする(デフォルト10世代)
=file選択された先頭1,000バイトをfileへ出力

例えばこれを応用してqmailのログ取得スクリプトを以下の様にすることも可能です。

#!/bin/sh

#
# qmail/log/run : qmail log starting script
#

exec env - PATH="/var/qmail/bin:/sbin:/bin:/usr/sbin:/usr/bin: \
/usr/local/sbin:/usr/local/bin" \
setuidgid qmails multilog t ./main \
-'* status: *' \
-'* starting delivery *' \
-'* delivery * success*' \
-'* delivery * failure*' \
-'* new msg *' \
-'* info msg *' \
-'* end msg *' \
-'* bounce msg *' \
-"* delivery * deferral: Sorry,_I_couldn't_find_any_host_by_that_name*" \
-"* delivery * deferral: Sorry,_I_wasn't_able_to_establish_an_SMTP_*" \
./alert \
-'*' \
+'* status: *' \
=status

./mainディレクトリには通常のログを./alertディレクトリにはエラーログ等をといった感じでパターンマッチングした例です。

これでmultilogを利用したログ取得方法の説明は終了です。

marronおすすめの参考書 by Amazon
AVQ251-500-N アンチウィルス for Linux Qmail版 AVQ251-500-N アンチウィルス for Linux Qmail版
ギデオン /
¥ 415,800
AVQ1-50-N アンチウィルス for Linux Qmail版 AVQ1-50-N アンチウィルス for Linux Qmail版
ギデオン /
¥ 138,600
AVQ51-100-N アンチウィルス for Linux Qmail版 AVQ51-100-N アンチウィルス for Linux Qmail版
ギデオン /
¥ 207,900

Copyright(C) 2004-2006 マロンくん.NET ~サーバ管理者への道~ All Rights. Reserved.