Zend_Log-Overview.xml 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. <sect1 id="zend.log.overview">
  2. <title>概述</title>
  3. <para>
  4. <code>Zend_Log</code> 是一个通用日志组件.
  5. 它支持多个日志后端,格式化发送给日志的消息,过滤被纪录的消息.这些功能被划分为如下的对象:
  6. <itemizedlist>
  7. <listitem>
  8. <para>
  9. 一个Log (<code>Zend_Log</code>的实例)是应用程序使用最多的对象.如果你想你可以有任意多的Log对象;
  10. 它们之间不会相互影响.一个Log对象必须至少包含一个Writer对象,可选的可以包含一个或多个Filter.
  11. </para>
  12. </listitem><listitem>
  13. <para>
  14. 一个 Writer (继承自<code>Zend_Log_Writer_Abstract</code>) 负责向存储中保存数据.
  15. </para>
  16. </listitem><listitem>
  17. <para>
  18. 一个 Filter (实现 <code>Zend_Log_Filter_Interface</code>接口)阻塞数据被保存.一个Filter可以应用到个别的Writer,
  19. 或则在所有Writer之前应用到一个Log.这样Filter是串联起来的.
  20. </para>
  21. </listitem><listitem>
  22. <para>
  23. 一个 Formatter (实现了 <code>Zend_Log_Formatter_Interface</code>接口)
  24. 在由Writer写入数据之前可以对日志数据进行格式化.每一个Writer只能有一个Formatter.
  25. </para>
  26. </listitem>
  27. </itemizedlist>
  28. </para>
  29. <sect2 id="zend.log.overview.creating-a-logger">
  30. <title>创建Log</title>
  31. <para>
  32. 如要启动日志纪录,实例化一个Writer并把它传递给Log实例:
  33. <programlisting role="php"><![CDATA[
  34. $logger = new Zend_Log();
  35. $writer = new Zend_Log_Writer_Stream('php://output');
  36. $logger->addWriter($writer);
  37. ]]>
  38. </programlisting>
  39. 注意Log必须至少有一个Writer.你可以用<code>addWriter</code>方法添加任意数量的Writer.
  40. </para>
  41. <para>
  42. 你也可以直接把Writer传递给Log的构造函数:
  43. <programlisting role="php"><![CDATA[
  44. $writer = new Zend_Log_Writer_Stream('php://output');
  45. $logger = new Zend_Log($writer);
  46. ]]>
  47. </programlisting>
  48. 现在Log就可以使用了.
  49. </para>
  50. </sect2>
  51. <sect2 id="zend.log.overview.logging-messages">
  52. <title>日志消息</title>
  53. <para>
  54. 要纪录消息,调用Log实例的<code>log()</code>方法,并向其传递消息和消息等级.
  55. <programlisting role="php"><![CDATA[
  56. $logger->log('Informational message', Zend_Log::INFO);
  57. ]]>
  58. </programlisting>
  59. <code>log()</code>方法的第一个参数是是一个字符串<code>message</code>,第二个参数是一个整数<code>priority</code>.
  60. priortiy必须是一个可以被Log实例识别的消息等级之一.这会在下一节解释.
  61. </para>
  62. <para>
  63. 有快捷的方法可以使用.而不是调用<code>log()</code>方法,你可以调用于消息等级同名的方法:
  64. <programlisting role="php"><![CDATA[
  65. $logger->log('Informational message', Zend_Log::INFO);
  66. $logger->info('Informational message');
  67. $logger->log('Emergency message', Zend_Log::EMERG);
  68. $logger->emerg('Emergency message');
  69. ]]>
  70. </programlisting>
  71. </para>
  72. </sect2>
  73. <sect2 id="zend.log.overview.destroying-a-logger">
  74. <title>销毁Log</title>
  75. <para>
  76. 如果Log对象不再需要,设置包含Log实例的变量为<code>null</code>即可销毁它.
  77. 这会在Log对象被销毁前自动地调用每个附加在Log上的Writer的<code>shutdown()</code>方法:
  78. <programlisting role="php"><![CDATA[
  79. $logger = null;
  80. ]]>
  81. </programlisting>
  82. 在此方法中明确的销毁日志是可选的,并且在PHP关闭是自动执行.
  83. </para>
  84. </sect2>
  85. <sect2 id="zend.log.overview.builtin-priorities">
  86. <title>使用内建的消息等级</title>
  87. <para>
  88. <code>Zend_Log</code> 类定义了下面的消息等级:
  89. <programlisting role="php"><![CDATA[
  90. EMERG = 0; // Emergency: 系统不可用
  91. ALERT = 1; // Alert: 报警
  92. CRIT = 2; // Critical: 紧要
  93. ERR = 3; // Error: 错误
  94. WARN = 4; // Warning: 警告
  95. NOTICE = 5; // Notice: 通知
  96. INFO = 6; // Informational: 一般信息
  97. DEBUG = 7; // Debug: 小时消息]]>
  98. </programlisting>
  99. 这些属性总是可用的.同样还可以使用其对应的快捷方法.
  100. </para>
  101. <para>
  102. 消息等级不是任意的,它们来自BSD的<code>syslog</code>协议,它们在
  103. <ulink url="http://tools.ietf.org/html/rfc3164">RFC-3164</ulink>
  104. RFC文档中有阐述.名字和对应的消息等级号于其他PHP日志系统是兼容的,
  105. 例如<ulink url="http://pear.php.net/package/log">PEAR Log</ulink>,
  106. 它也许能够和<code>Zend_Log</code>进行互操作.
  107. </para>
  108. <para>
  109. 消息等级号以重要性顺序排序.<code>EMERG</code> (0)是最重要的消息等级.
  110. <code>DEBUG</code> (7) 是内建属性中的次重要的消息等级.你可以定义重要性低于<code>DEBUG</code>的属性.
  111. 当在日志消息中选择消息等级时,要知道消息等级的层次并选择合适的消息等级.
  112. </para>
  113. </sect2>
  114. <sect2 id="zend.log.overview.user-defined-priorities">
  115. <title>添加用户定义的日志等级</title>
  116. <para>
  117. 用户定义的消息等级可以在运行时通过Log对象的<code>addPriority()</code>方法添加:
  118. <programlisting role="php"><![CDATA[
  119. $logger->addPriority('FOO', 8);
  120. ]]>
  121. </programlisting>
  122. 上面的代码片断创建了一个新的日志消息等级, <code>FOO</code>,它的值为 <code>8</code>,
  123. 这个新的消息等级可以被用于日志:
  124. <programlisting role="php"><![CDATA[
  125. $logger->log('Foo message', 8);
  126. $logger->foo('Foo Message');
  127. ]]>
  128. </programlisting>
  129. 新的消息等级不能覆盖已有的.
  130. </para>
  131. </sect2>
  132. <sect2 id="zend.log.overview.understanding-fields">
  133. <title>理解日志事件</title>
  134. <para>
  135. 当你调用<code>log()</code>方法或它们的快捷方式时,日志事件即被创建.这是一个简单的关联数组,
  136. 它描述了传递给Writer的事件.下面的数组键总是在数组中创建:<code>timestamp</code>,
  137. <code>message</code>, <code>priority</code>, and
  138. <code>priorityName</code>.
  139. </para>
  140. <para>
  141. <code>event</code>数组的创建是完全透明的.但是对于添加上面默认设置中不存在的项,
  142. 对<code>event</code>数组的了解是必须的.
  143. </para>
  144. <para>
  145. 给每个将来的事件添加新项,用给定的键值调用<code>setEventItem()</code>方法:
  146. <programlisting role="php"><![CDATA[
  147. $logger->setEventItem('pid', getmypid());
  148. ]]>
  149. </programlisting>
  150. 上面的例子设置了一个名为<code>pid</code>的新项并设置它为当前进程的PID.一旦一个新的项被设置,
  151. 在日志纪录中,它自动对其他所有writer和所有事件数据可用.一个项可以在任何时候再次调用<code>setEventItem()</code>
  152. 方法被覆盖.
  153. </para>
  154. <para>
  155. 用<code>setEventItem()</code>设置一个新的事件项将导致新项发送给Logger的所有Writer.但是
  156. 这不能保证writer实际地纪录了该项.这是由于writer并不知道该怎么做,除非formatter通告了一个新项.
  157. 要了解更多,请查看Formatter.
  158. </para>
  159. </sect2>
  160. </sect1>