メールサーバの動作状況を知るうえで欠かせないログ。このログを効率的かつ的確に抽出・分析することが重要になる。ツールを導入して分析環境を整えよう。
前回のdaemontoolsの導入で、柔軟なプロセス管理と強力なロギング機能が実現しました。ログは、活用次第で単なるディスクの肥やしにもなれば、サーバ運営の潤滑剤にもなります。ログを取るのは不正アクセス対抗策の定石ですが、それを普段の運用に生かす技術を習得しなければなりません。
前回は、daemontoolsに含まれるtai64nlocalコマンドでタイムスタンプを変換し、難解なTAI64N形式のログも目で追えるようになることを紹介しました。障害や不正アクセスが発生した日時を起点にログを順番に眺めていくことで、その形跡を見つけることができます。
では、日常的に必要な統計情報を得る場合はどうでしょう。qmail-pop3dやqmail-smtpdの起動数やキューにたまっているメッセージの残数など、サーバを連続稼働させるうえで必要不可欠な情報も、ログの中に埋もれています。ログから必要な部分を抜き出し、計算させることで情報を引き出せるのは容易に想像できますが、それをどう実現するかとなると閉口しがちです。
Apacheでは、強力でしかも無料で使用できるアクセスログ解析ツールAnalogを使用することが広く知られています(「ApacheによるWebサーバ構築」第14回 ログローテーションとAnalogの導入)。qmailにも、Analogのような解析ツールが用意されています。qmailの作者であるD. J. Bernstein氏による「qmailanalog」が望みをかなえてくれます(注)。
qmailanalogをインストールすると、頭文字「z」の統計スクリプト群が使用可能になります。用途ごとにスクリプトが分かれているため、目的によって使い分ける必要があります。
上記のスクリプトに、直接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つのスクリプトにまとめておくと便利です。
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
次に、makeを実行して各ファイルをインストールします。
# make # make setup check
ここでログ解析ツール「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で公開されているものを少し手直しして(注)使用します。
スクリプト(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
以上で、自動的にレポートを作成して決まった時間に受け取れるようになりました。
また、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に登録します。
Copyright © ITmedia, Inc. All Rights Reserved.