Email への書き込み Zend_Log_Writer_Mail は、 Zend_Mail を使ってログエントリをメールのメッセージに書き出します。 Zend_Log_Writer_Mail のコンストラクタは Zend_Mail オブジェクトを受け取り、 またオプションで Zend_Layout オブジェクトを受け取ります。 Zend_Log_Writer_Mail の主な使い道は、 開発者やシステム管理者など関係者に対して PHP スクリプトで発生したエラーを通知することです。 「何か問題がおこったら、すぐに人間に通知しないとね。 そうすればすぐに適切な対応ができるわけだから」そんなアイデアを元に Zend_Log_Writer_Mail が誕生しました。 基本的な使い方は以下のとおりです。 setFrom('errors@example.org') ->addTo('project_developers@example.org'); $writer = new Zend_Log_Writer_Mail($mail); // 件名に使用するテキストを設定します。実際にメッセージを送信する前に、 // 発生したエラー数がこの件名に付け加えられます $writer->setSubjectPrependText('Errors with script foo.php'); // 警告レベル以上の場合にのみメールを送信します $writer->addFilter(Zend_Log::WARN); $log = new Zend_Log(); $log->addWriter($writer); // なにかが起こりました! $log->error('unable to connect to database'); // ライターの処理が終了すると Zend_Mail::send() が立ち上がり、 // 上の Zend_Log フィルタレベル以上のすべてのログメッセージが送信されます ]]> Zend_Log_Writer_Mail は、デフォルトで メールの本文をプレーンテキスト形式でレンダリングします。 指定したフィルタレベル以上のすべてのログエントリが、 ひとつのメールにまとめて送られます。たとえば、 警告レベル以上を送信するよう設定しているときに 2 つの警告と 5 つのエラーが発生したら、 メールには 7 つのログエントリが含まれることになります。 Zend_Layout の使用法 Zend_Layout のインスタンスを使用して、 マルチパートメールの HTML 部を作成できます。 Zend_Layout のインスタンスが用いられた場合、 Zend_Log_Writer_MailHTML をレンダリングするものとみなし、 Zend_Layout がレンダリングした値をメッセージの本文 HTML として設定します。 Zend_Log_Writer_MailZend_Layout のインスタンスを使う場合には、 setLayoutFormatter() メソッドで独自のフォーマッタを指定できます。 Zend_Layout 用のエントリフォーマッタを指定しなかった場合は、 現在使用中のものをそのまま使います。 Zend_Layout で独自のフォーマッタを使用する方法を以下に示します。 setFrom('errors@example.org') ->addTo('project_developers@example.org'); // 件名は Zend_Mail のインスタンスには設定していないことに注意しましょう! // シンプルに、デフォルトの Zend_Layout のインスタンスを使用します $layout = new Zend_Layout(); // エントリを li タグで囲むフォーマッタを作成します $layoutFormatter = new Zend_Log_Formatter_Simple( '
  • ' . Zend_Log_Formatter_Simple::DEFAULT_FORMAT . '
  • ' ); $writer = new Zend_Log_Writer_Mail($mail, $layout); // Zend_Layout でレンダリングするための、エントリのフォーマッタを適用します $writer->setLayoutFormatter($layoutFormatter); $writer->setSubjectPrependText('Errors with script foo.php'); $writer->addFilter(Zend_Log::WARN); $log = new Zend_Log(); $log->addWriter($writer); // なにかが起こりました! $log->error('unable to connect to database'); // ライターの処理が終了すると Zend_Mail::send() が立ち上がり、 // 上の Zend_Log フィルタレベル以上のすべてのログメッセージが送信されます // メールは、プレーンテキストと HTML パートの両方を含む形式になります ]]>
    件名でのエラーの概要 setSubjectPrependText() メソッドを Zend_Mail::setSubject() のかわりに使用すると、 メールを送信する直前に件名を動的に書き込むことができます。たとえば、 件名のテキストが "Errors from script" だとすると、 2 つの警告と 5 つのエラーが発生した場合に Zend_Log_Writer_Mail が作成するメールの件名は "Errors from script (warn = 2; error = 5)" となります。Zend_Log_Writer_Mail で件名のテキストを設定しなかった場合、もし Zend_Mail で設定されていればそれを使用します。 警告 ログエントリをメールでおくるのは危険なこともあります。 スクリプト内でのエラー条件の処理が不適切だったり エラーレベルの使用法を間違えたりすると、 エラーの発生頻度によっては何百通何千通ものメールを送信してしまう可能性があります。 現時点では、Zend_Log_Writer_Mail にはメッセージを抑制したりひとつにまとめたりする機能はありません。 そのような機能が必要な場合は自前で実装する必要があります。 もう一度言いますが、Zend_Log_Writer_Mail の第一の目標は、人間に向けてエラーの情報を積極的に伝えることです。 これらのエラーがタイミングよく処理され、 このような状況が避けられるような機能が実装されたときには、 メールによるエラー通知は便利な道具となることでしょう。