ツールを使った効率的なログ分析術実用qmailサーバ運用・管理術(10)(1/2 ページ)

メールサーバの動作状況を知るうえで欠かせないログ。このログを効率的かつ的確に抽出・分析することが重要になる。ツールを導入して分析環境を整えよう。

» 2002年06月22日 00時00分 公開
[鶴長鎮一@IT]

 前回のdaemontoolsの導入で、柔軟なプロセス管理と強力なロギング機能が実現しました。ログは、活用次第で単なるディスクの肥やしにもなれば、サーバ運営の潤滑剤にもなります。ログを取るのは不正アクセス対抗策の定石ですが、それを普段の運用に生かす技術を習得しなければなりません。

qmailanalogの利用

 前回は、daemontoolsに含まれるtai64nlocalコマンドでタイムスタンプを変換し、難解なTAI64N形式のログも目で追えるようになることを紹介しました。障害や不正アクセスが発生した日時を起点にログを順番に眺めていくことで、その形跡を見つけることができます。

 では、日常的に必要な統計情報を得る場合はどうでしょう。qmail-pop3dやqmail-smtpdの起動数やキューにたまっているメッセージの残数など、サーバを連続稼働させるうえで必要不可欠な情報も、ログの中に埋もれています。ログから必要な部分を抜き出し、計算させることで情報を引き出せるのは容易に想像できますが、それをどう実現するかとなると閉口しがちです。

 Apacheでは、強力でしかも無料で使用できるアクセスログ解析ツールAnalogを使用することが広く知られています(「ApacheによるWebサーバ構築」第14回 ログローテーションとAnalogの導入)。qmailにも、Analogのような解析ツールが用意されています。qmailの作者であるD. J. Bernstein氏による「qmailanalog」が望みをかなえてくれます()。

注:wcなどのUNIXコマンドとshスクリプトを組み合わせてツールを自作することも可能です。さらにPerlが使えれば、ほぼ意図する情報を手に入れられることでしょう。しかし、大抵の統計情報はqmailanalogで手軽に得ることができます。

qmailanalogによるログ解析の流れ

 qmailanalogをインストールすると、頭文字「z」の統計スクリプト群が使用可能になります。用途ごとにスクリプトが分かれているため、目的によって使い分ける必要があります。

  • zdeferrals:deferrals(配送が先延ばし)されたときの理由の集計
  • zddist:メール遅送の集計
  • zfailures:失敗メールの確認
  • zoverall:基本的で最も重要な統計
  • zrecipients:受け取り先の統計
  • zrhosts:相手のホストの集計
  • zrxdelay:受け取り先の統計(遅れ具合でソート)
  • zsenders:差し出し元の集計
  • zsuccesses:成功時の理由の集計
  • zsuids:差し出し元のUID集計

 上記のスクリプトに、直接multilogで生成されたログファイルを流し込むことはできません。qmailanalogに含まれるmatchupコマンドでログを整形する必要があります。また、matchup実行時に統計を取る期間を指定できないため、スクリプトにログファイルを読み込ませる際に必要な期間の分を切り出しておかなければなりません。さらに都合が悪いことに、multilogで生成されたログファイルのローテーションはサイズを基準としているため、例えば昨日1日分の統計情報が欲しい場合に、集計対象のログが複数に分割されてしまっている可能性があります。

 残念ながら、qmailanalogには特定の期間や時間のログだけを抜き出すスクリプトやコマンドはなく、自作するなど別途用意する必要があります。そこで、今回はPerlスクリプト「qlogselect」を用意することにします。qlogselectを使用することで、望みの日付や時間でログを抽出できるようになります。

 必要な処理をまとめてみましょう。

1./var/log/qmail/ディレクトリ下のログファイルからqlogselectコマンドで指定のログを抽出する

       ↓

2.抽出したログをmatchupで整形し、一時ファイルに保存

       ↓

3.一時保存したファイルを各スクリプト(頭文字zで始まるスクリプト)で使用し、必要な情報を収集する

       ↓

4.メールで管理者に報告

 こうした運用レポートをメールで受け取れるようにしておくと、後々日付ごとにレポートを整理したり過去のデータを呼び出すなどできるので、管理の面で大きく貢献します。さらに、crontab(Linux Tips:プログラムを定期的に実行するには)で定期的に集計できるようにしておけば、これらの定型業務を自動化できます。そのためには、1から4までの処理を1つのスクリプトにまとめておくと便利です。

qmailanalogのインストール

 http://cr.yp.to/qmailanalog.htmlからqmailanalog-0.70.tar.gzをダウンロードし、適当な作業ディレクトリに保存します。保存したらtarコマンドで展開し、生成されたディレクトリに移動します。

# tar xvfz qmailanalog-0.70.tar.gz
# cd qmailanalog-0.70

 デフォルトのインストール先は/usr/local/qmailanalogになり、この下にbin/、doc/、man/ディレクトリが作成されます。インストール先を変更したい場合は、conf-homeファイルを編集します。

/usr/local/qmailanalog
conf-homeファイル

 次に、makeを実行して各ファイルをインストールします。

# make
# make setup check

qlogtoolsのインストールとqlogselectの準備

 ここでログ解析ツール「qlogtools」をインストールします。http://untroubled.org/qlogtools/からqlogtools-3.1.tar.gzを入手し、展開とmakeを実行します。

# tar xvfz qlogtools-3.1.tar.gz
# cd qlogtools-3.1
# make
# ./installer

 正常にインストールできたかどうかは、instcheckコマンドで確認できます。特に何も表示されなければ成功です。また、どこにどのファイルがインストールされたかは、instshowコマンドで確認します。

 次にqlogselectを準備します。qlogselectはqlogtoolsの一部でしたが、最新のqlogtools-3.1には収録されていません。また、古いバージョンのqlogtoolsを入手することもできないため、qlogselectだけをhttp://www.qcc.sk.ca/~charlesc/software/misc/からダウンロードします。特に修正することはありませんが、実行可能とするためにパーミッションを変更します。変更したらqmailanalogのインストール先(例では/usr/local/qmailanalog/bin)に移動しておきます。こうしておくと、この後の実行スクリプト作成時にパス指定の手間を若干簡略化できます。

# chmod +x qlogselect
# mv qlogselect /usr/local/qmailanalog/bin

実行スクリプトの作成

 次に、一連の処理を行うスクリプトを作成します。今回は、http://www.ornl.gov/its/archives/mailing-lists/qmail/2001/06/msg01283.htmlで公開されているものを少し手直しして()使用します。

注:上記URLのスクリプトはメールを送る処理でmuttを使用していますが、今回はこれをqmail-injectに変更します。

 スクリプト(analog.sh)の中身は、20行目までが各値の宣言、それ以降が実際の処理になります。修正が必要な項目を簡単に説明します。

 1 #!/bin/sh
 2 MAILTO=user1@example.jp
 3 MAILFROM=user2@example.jp
 4 export PATH="$PATH:/root/bin:/usr/local/qmailanalog/bin:
/var/qmail/bin:/usr/local/bin"
 5 tmpdir=/tmp/qmail-cron.$$.$RANDOM
 6
 7 mkdir $tmpdir
 8 pushd $tmpdir >/dev/null
 9
10 s_year=`date -d '1 day ago' +%Y`
11 s_month=`date -d '1 day ago' +%m`
12 s_day=`date -d '1 day ago' +%d`
13 e_year=`date +%Y`
14 e_month=`date +%m`
15 e_day=`date +%d`
16
17 start="$s_year-$s_month-$s_day"
18 end="$e_year-$e_month-$e_day"
19
20 LOGDIR=/var/log/qmail
21
22 cat "$LOGDIR"/{"@",cur}* \
23   | tai64n2tai \
24   | qlogselect start $start end $end \
25   | matchup >logfile 5>/dev/null
26
27 for ana in zoverall zddist zdeferrals zfailures zrhosts
 zsuids zrxdelay; do
28   echo "" >>result
29   echo "-----------Result of $ana------------" >>result
30   $ana 2>/dev/null <logfile >>result
31 done
32 rm -f logfile
33
34 (echo "To: $MAILTO"
35 echo "From: $MAILFROM"
36 echo "Subject: mailstats for $s_year-$s_month-$s_day"
37 echo ""
38 cat result )| qmail-inject -f $MAILFROM
39 rm -f result
40 popd >/dev/null
41 rm -rf $tmpdir

リストanalog.sh 説明のため、行番号を付けています(行番号なしのファイルはこちら

 まず2行目のレポートの受け取り先と、3行目の送信者のメールアドレスは最低限修正が必要です。10〜18行目は集計対象とする期間を指定します。サンプルでは1日を対象にしていますが、2日間に変更する場合は「1 day ago」を「2 days ago」に、1週間にする場合は「1 week ago」のようにします。ここで宣言したstart/end変数は、qlogselectの引数に指定します。qlogselectは、指定されたstartとendでログの抽出を行います()。

注:ログの抽出で長い期間を指定する場合は、その期間以上のログが蓄えられている必要があります。

 また、インストール環境によっては20行目の修正が必要な場合があります。ここでは、multilogで生成されるログファイルの保存先を指定します。次に、27行目で必要な情報を集計するコマンドを指定します。サンプルではzoverall、zddist、zdeferrals、zfailures、zrhosts、zsuids、zrxdelayの7つのコマンドが指定されていますが、大抵はzoverallだけでも十分な集計結果が得られるはずです。必要に応じてコマンドリストを削ります。

 作成したスクリプトは、/usr/local/qmailanalog/bin/analog.shとして保存します。スクリプトに実行権を与えて実行します。

# mv analog.sh /usr/local/qmailanalog/bin/analog.sh
# cd /usr/local/qmailanalog/bin/
# chmod +x analog.sh
# ./analog.sh

 次のような結果がレポートの受け取り先に届いていれば成功です。もし「command not found」と出るようなら、4行目のコマンドパスが適切かどうか確認します。また、/var/log/qmailへの参照はroot権限が必要なため、rootユーザーで実行しないとエラーになります。

-----------Result of zoverall------------
Basic statistics
qtime is the time spent by a message in the queue.
ddelay is the latency for a successful delivery to one recipient---
the end of successful delivery, minus the time when the message was
 queued.
xdelay is the latency for a delivery attempt---the time when the 
attempt finished, minus the time when it started. The average concurrency is  the
total xdelay for all deliveries divided by the time span; this is 
a good
measure of how busy the mailer is.
Completed messages: 86
Recipients for completed messages: 97
Total delivery attempts for completed messages: 97
Average delivery attempts per completed message: 1.12791
Bytes in completed messages: 11332210
Bytes weighted by success: 26902150
Average message qtime (s): 4.86025
Total delivery attempts: 97
  success: 95
  failure: 2
  deferral: 0
Total ddelay (s): 1131.142170
Average ddelay per success (s): 11.906760
Total xdelay (s): 1134.007247
Average xdelay per delivery attempt (s): 11.690796
Time span (days): 0.977178
Average concurrency: 0.0134316
-----------Result of zddist------------
Distribution of ddelays for successful deliveries
(以下略)
レポートのサンプル

 スクリプトの実行が確認できたら、crontabで1日1回実行されるように設定します。

# crontab -e
(以下が追加分)
01 0 * * * /usr/local/qmailanalog/bin/analog.sh >/dev/null 2>&1
0時1分に起動する場合

 以上で、自動的にレポートを作成して決まった時間に受け取れるようになりました。

 また、syslogdで取ったログからでも同様のレポートが作成できます。具体的な方法についてはコラムを参照してください。

コラム syslogd環境でのレポート作成

 daemontoolsを導入せずにsyslogdを使っている場合は、/var/log/maillogなどsyslog.confで指定されたファイルにログが出力されています。このmaillogファイルを使ってレポートを作成するには、次のような手順で作業を行います。

 まず、syslogdによって蓄えられたログには、各行の先頭に日付やホスト名など余分なフィールドがあるので削除します。matchupには整形の後のログを渡し、結果を一時ファイルとして/tmp/testに出力します。

# /usr/bin/awk '{$1="";$2="";$3="";$4="";$5="";print}' /var/log/maillog.qmail | /usr/local/qmailanalog/bin/matchup > /tmp/test

 生成された/tmp/testを各集計コマンドに渡すことで、multilog使用時と同様のレポートを得ることができます。

# /usr/local/qmailanalog/bin/zoverall < /tmp/test
Basic statistics
qtime is the time spent by a message in the queue.
ddelay is the latency for a successful delivery to one recipient---the
end of successful delivery, minus the time when the message was queued.
xdelay is the latency for a delivery attempt---the time when the attempt
finished, minus the time when it started. The average concurrency is the
total xdelay for all deliveries divided by the time span; this is a good
measure of how busy the mailer is.
Completed messages: 6
Recipients for completed messages: 4
Total delivery attempts for completed messages: 4
Average delivery attempts per completed message: 0.666667
Bytes in completed messages: 8567
Bytes weighted by success: 5235
Average message qtime (s): 0.0264897
Total delivery attempts: 4
success: 4
failure: 0
deferral: 0
Total ddelay (s): 0.155049
Average ddelay per success (s): 0.038762
Total xdelay (s): 0.138070
Average xdelay per delivery attempt (s): 0.034517
Time span (days): 0.00754269
Average concurrency: 0.000211865

 ここまでの処理を自動化するには、http://www.emaillab.org/djb/qmailanalog/qmailanalog.htmlを参考にスクリプトを作成し、crontabに登録します。


       1|2 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。