Zend_Log-Writers-Mail.xml 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- Reviewed: no -->
  3. <!-- EN-Revision: 24249 -->
  4. <sect2 id="zend.log.writers.mail">
  5. <title>Email への書き込み</title>
  6. <para>
  7. <classname>Zend_Log_Writer_Mail</classname> は、
  8. <classname>Zend_Mail</classname> を使ってログエントリをメールのメッセージに書き出します。
  9. <classname>Zend_Log_Writer_Mail</classname> のコンストラクタは
  10. <classname>Zend_Mail</classname> オブジェクトを受け取り、
  11. またオプションで <classname>Zend_Layout</classname> オブジェクトを受け取ります。
  12. </para>
  13. <para>
  14. <classname>Zend_Log_Writer_Mail</classname> の主な使い道は、
  15. 開発者やシステム管理者など関係者に対して
  16. <acronym>PHP</acronym> スクリプトで発生したエラーを通知することです。
  17. 「何か問題がおこったら、すぐに人間に通知しないとね。
  18. そうすればすぐに適切な対応ができるわけだから」そんなアイデアを元に
  19. <classname>Zend_Log_Writer_Mail</classname> が誕生しました。
  20. </para>
  21. <para>
  22. 基本的な使い方は以下のとおりです。
  23. </para>
  24. <programlisting language="php"><![CDATA[
  25. $mail = new Zend_Mail();
  26. $mail->setFrom('errors@example.org')
  27. ->addTo('project_developers@example.org');
  28. $writer = new Zend_Log_Writer_Mail($mail);
  29. // 件名に使用するテキストを設定します。実際にメッセージを送信する前に、
  30. // 発生したエラー数がこの件名に付け加えられます
  31. $writer->setSubjectPrependText('Errors with script foo.php');
  32. // 警告レベル以上の場合にのみメールを送信します
  33. $writer->addFilter(Zend_Log::WARN);
  34. $log = new Zend_Log();
  35. $log->addWriter($writer);
  36. // なにかが起こりました!
  37. $log->error('unable to connect to database');
  38. // ライターの処理が終了すると Zend_Mail::send() が立ち上がり、
  39. // 上の Zend_Log フィルタレベル以上のすべてのログメッセージが送信されます
  40. ]]></programlisting>
  41. <para>
  42. <classname>Zend_Log_Writer_Mail</classname> は、デフォルトで
  43. メールの本文をプレーンテキスト形式でレンダリングします。
  44. </para>
  45. <para>
  46. 指定したフィルタレベル以上のすべてのログエントリが、
  47. ひとつのメールにまとめて送られます。たとえば、
  48. 警告レベル以上を送信するよう設定しているときに
  49. 2 つの警告と 5 つのエラーが発生したら、
  50. メールには 7 つのログエントリが含まれることになります。
  51. </para>
  52. <sect3 id="zend.log.writers.mail.layoutusage">
  53. <title>Zend_Layout の使用法</title>
  54. <para>
  55. <classname>Zend_Layout</classname> のインスタンスを使用して、
  56. マルチパートメールの <acronym>HTML</acronym> 部を作成できます。
  57. <classname>Zend_Layout</classname> のインスタンスが用いられた場合、
  58. <classname>Zend_Log_Writer_Mail</classname> は <acronym>HTML</acronym> をレンダリングするものとみなし、
  59. <classname>Zend_Layout</classname> がレンダリングした値をメッセージの本文
  60. <acronym>HTML</acronym> として設定します。
  61. </para>
  62. <para>
  63. <classname>Zend_Log_Writer_Mail</classname> で
  64. <classname>Zend_Layout</classname> のインスタンスを使う場合には、
  65. <methodname>setLayoutFormatter()</methodname> メソッドで独自のフォーマッタを指定できます。
  66. <classname>Zend_Layout</classname> 用のエントリフォーマッタを指定しなかった場合は、
  67. 現在使用中のものをそのまま使います。
  68. <classname>Zend_Layout</classname> で独自のフォーマッタを使用する方法を以下に示します。
  69. </para>
  70. <programlisting language="php"><![CDATA[
  71. $mail = new Zend_Mail();
  72. $mail->setFrom('errors@example.org')
  73. ->addTo('project_developers@example.org');
  74. // 件名は Zend_Mail のインスタンスには設定していないことに注意しましょう!
  75. // シンプルに、デフォルトの Zend_Layout のインスタンスを使用します
  76. $layout = new Zend_Layout();
  77. // エントリを li タグで囲むフォーマッタを作成します
  78. $layoutFormatter = new Zend_Log_Formatter_Simple(
  79. '<li>' . Zend_Log_Formatter_Simple::DEFAULT_FORMAT . '</li>'
  80. );
  81. $writer = new Zend_Log_Writer_Mail($mail, $layout);
  82. // Zend_Layout でレンダリングするための、エントリのフォーマッタを適用します
  83. $writer->setLayoutFormatter($layoutFormatter);
  84. $writer->setSubjectPrependText('Errors with script foo.php');
  85. $writer->addFilter(Zend_Log::WARN);
  86. $log = new Zend_Log();
  87. $log->addWriter($writer);
  88. // なにかが起こりました!
  89. $log->error('unable to connect to database');
  90. // ライターの処理が終了すると Zend_Mail::send() が立ち上がり、
  91. // 上の Zend_Log フィルタレベル以上のすべてのログメッセージが送信されます
  92. // メールは、プレーンテキストと HTML パートの両方を含む形式になります
  93. ]]></programlisting>
  94. </sect3>
  95. <sect3 id="zend.log.writers.mail.dynamicsubjectline">
  96. <title>件名でのエラーの概要</title>
  97. <para>
  98. <methodname>setSubjectPrependText()</methodname> メソッドを
  99. <methodname>Zend_Mail::setSubject()</methodname> のかわりに使用すると、
  100. メールを送信する直前に件名を動的に書き込むことができます。たとえば、
  101. 件名のテキストが "Errors from script" だとすると、
  102. 2 つの警告と 5 つのエラーが発生した場合に <classname>Zend_Log_Writer_Mail</classname>
  103. が作成するメールの件名は "Errors from script (warn = 2;
  104. error = 5)" となります。<classname>Zend_Log_Writer_Mail</classname>
  105. で件名のテキストを設定しなかった場合、もし <classname>Zend_Mail</classname>
  106. で設定されていればそれを使用します。
  107. </para>
  108. </sect3>
  109. <sect3 id="zend.log.writers.mail.caveats">
  110. <title>警告</title>
  111. <para>
  112. ログエントリをメールでおくるのは危険なこともあります。
  113. スクリプト内でのエラー条件の処理が不適切だったり
  114. エラーレベルの使用法を間違えたりすると、
  115. エラーの発生頻度によっては何百通何千通ものメールを送信してしまう可能性があります。
  116. </para>
  117. <para>
  118. 現時点では、<classname>Zend_Log_Writer_Mail</classname>
  119. にはメッセージを抑制したりひとつにまとめたりする機能はありません。
  120. そのような機能が必要な場合は自前で実装する必要があります。
  121. </para>
  122. <para>
  123. もう一度言いますが、<classname>Zend_Log_Writer_Mail</classname>
  124. の第一の目標は、人間に向けてエラーの情報を積極的に伝えることです。
  125. これらのエラーがタイミングよく処理され、
  126. このような状況が避けられるような機能が実装されたときには、
  127. メールによるエラー通知は便利な道具となることでしょう。
  128. </para>
  129. </sect3>
  130. </sect2>
  131. <!--
  132. vim:se ts=4 sw=4 et:
  133. -->