Postfixのログのサマリーを作成して,メイルでrootに送る.

前提とする環境: Postfixのログはnewsyslog(8)で毎日0時にローテーションし,最新のもの以外はbzip2で圧縮している.

  • ログの集計にはpflogsummを用いるのでports collectionpflogsummをインストールする.

  • Postfixにメイルを差し戻す(after-queue)コンテンツ・フィルタやウィルス・スキャナを使っているとpflogsummの集計が正しく行われない1ので,pflogsummでPostfixのlogを処理する前にprepflogで前処理をする.このため,prepflogもインストールする.

  • 出力を確認する.

    % bzcat /var/log/maillog.0.bz2 | prepflog -d yesterday | pflogsumm -d yesterday --smtpd_stats --rej_add_from
    

    この出力をそのままパイプで/usr/bin/mailに渡すとbody_checksなどのルールに引っかかってしまうことがある.そこで,"Preventing daily mail status reports from being blocked“に書かれているように,出力をbase64でエンコードしメイルに添付することにする.

  • MIMEメッセージの作成・送信を行うperlスクリプトでMIME::Liteモジュールを使うので,p5-MIME-Liteをインストールする.

  • Preventing daily mail status reports from being blocked“を参考にして,以下のようなperlスクリプト2を作成し,適当な名前3を付け,適当な場所4に置き,実行許可を付けておく.

    #!/usr/bin/perl
    
    use MIME::Lite;
    
    ## Create a new message:
    
    $msg = MIME::Lite->new(
    		From     => 'root@example.jp',
    		To       => 'root@example.jp',
    		Subject  => 'Mail Summary for mail.example.jp',
    		Date     => `date`,
    		Type     => 'text/plain',
    		Encoding => 'base64',
    		Path     => '/tmp/mail_summ',
    );
    
    $msg->send;
    
  • rootのcrontabに以下を追加して,適当な時間5にレポートを送信する…

    20  0  *  *  *    bzcat /var/log/maillog.0.bz2 | prepflog -d yesterday | pflogsumm -d yesterday --smtpd_stats --rej_add_from > /tmp/mail_summ
    25  0  *  *  *    /root/bin/mail-summary > /dev/null 2>&1
    

  1. 同じメイルを複数回カウントしてしまう. ↩︎

  2. 参考にしたものとは,From, To, Subject, Pathだけが異なる.ただし,ここで示す例のドメインは例示用に変更してある. ↩︎

  3. ここでは,mail-summary. ↩︎

  4. ここでは,/root/bin/. ↩︎

  5. 実行時間は,ログのローテション後ならいつでも良い. ↩︎