2
0

Zend_Log-Writers.xml 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. <sect1 id="zend.log.writers" xmlns:xi="http://www.w3.org/2001/XInclude">
  2. <title>Writers</title>
  3. <para>
  4. 一个Writer是继承自<code>Zend_Log_Writer_Abstract</code>类的一个对象.Writer的职责是向存储后端纪录日志数据.
  5. </para>
  6. <sect2 id="zend.log.writers.stream">
  7. <title>写入到流(Streams)</title>
  8. <para>
  9. <code>Zend_Log_Writer_Stream</code> 写入日志数据到
  10. <ulink url="http://www.php.net/stream">PHP 流</ulink>中.
  11. </para>
  12. <para>
  13. 要把日志写入到输出缓冲区,使用URL<code>php:://output</code>. 或则你可以直接发送日志数据到像<code>STDERR</code>
  14. 这样的流中(php://stderr).
  15. <programlisting role="php"><![CDATA[
  16. $writer = new Zend_Log_Writer_Stream('php://output');
  17. $logger = new Zend_Log($writer);
  18. $logger->info('Informational message');
  19. ]]>
  20. </programlisting>
  21. </para>
  22. <para>
  23. 写入日志数据到一个文件,使用<ulink url="http://www.php.net/manual/en/wrappers.php#wrappers.file">Filesystem
  24. URLs</ulink>之一:
  25. <programlisting role="php"><![CDATA[
  26. $writer = new Zend_Log_Writer_Stream('/path/to/logfile');
  27. $logger = new Zend_Log($writer);
  28. $logger->info('Informational message');
  29. ]]>
  30. </programlisting>
  31. 默认情况流一个追加(<code>"a"</code>)的方式打开.要以不同的模式打开,Zend_Log_Writer_Stream
  32. 构造函数接受第二个参数作为可选的模式参数.
  33. </para>
  34. <para>
  35. <code>Zend_Log_Writer_Stream</code>还接受一个现有的流资源:
  36. <programlisting role="php"><![CDATA[
  37. $stream = @fopen('/path/to/logfile', 'a', false);
  38. if (! $stream) {
  39. throw new Exception('Failed to open stream');
  40. }
  41. $writer = new Zend_Log_Writer_Stream($stream);
  42. $logger = new Zend_Log($writer);
  43. $logger->info('Informational message');
  44. ]]>
  45. </programlisting>
  46. 你不能给现有的流资源指定模式.这样作将导致抛出一个<code>Zend_Log_Exception</code>异常.
  47. </para>
  48. </sect2>
  49. <sect2 id="zend.log.writers.database">
  50. <title>写入到数据库</title>
  51. <para>
  52. <code>Zend_Log_Writer_Db</code>使用<code>Zend_Db</code>写入日志信息到数据库表中.
  53. <code>Zend_Log_Writer_Db</code>的构造函数接受一个<code>Zend_Db_Adapter</code>
  54. 实例,一个表名,和一个数据库字段到事件数据项的映射:
  55. <programlisting role="php"><![CDATA[
  56. $params = array ('host' => '127.0.0.1',
  57. 'username' => 'malory',
  58. 'password' => '******',
  59. 'dbname' => 'camelot');
  60. $db = Zend_Db::factory('PDO_MYSQL', $params);
  61. $columnMapping = array('lvl' => 'priority', 'msg' => 'message');
  62. $writer = new Zend_Log_Writer_Db($db, 'log_table_name', $columnMapping);
  63. $logger = new Zend_Log($writer);
  64. $logger->info('Informational message');
  65. ]]>
  66. </programlisting>
  67. 上面的例子写入单个行到名称为<code>log_table_name</code>的数据库表中.数据库字段<code>lvs</code>
  68. 接收优先级号,名为<code>msg</code>的字段接收日志消息.
  69. </para>
  70. </sect2>
  71. <xi:include href="Zend_Log-Writers-Firebug.xml">
  72. <xi:fallback href="../en/module_specs/Zend_Log-Writers-Firebug.xml"/>
  73. </xi:include>
  74. <sect2 id="zend.log.writers.null">
  75. <title>踩熄Writer</title>
  76. <para>
  77. <code>Zend_Log_Writer_Null</code>是一个不向任何地方写入任何数据的存根.
  78. 用于在测试期间关闭或踩熄日志.
  79. <programlisting role="php"><![CDATA[
  80. $writer = new Zend_Log_Writer_Null;
  81. $logger = new Zend_Log($writer);
  82. // goes nowhere
  83. $logger->info('Informational message');
  84. ]]>
  85. </programlisting>
  86. </para>
  87. </sect2>
  88. <sect2 id="zend.log.writers.mock">
  89. <title>测试 Mock</title>
  90. <para>
  91. <code>Zend_Log_Writer_Mock</code>是一个非常简单的Writer,它纪录所接收到的原始的数据到到作为public属性的
  92. 数组中.
  93. <programlisting role="php"><![CDATA[
  94. $mock = new Zend_Log_Writer_Mock;
  95. $logger = new Zend_Log($mock);
  96. $logger->info('Informational message');
  97. var_dump($mock->events[0]);
  98. // Array
  99. // (
  100. // [timestamp] => 2007-04-06T07:16:37-07:00
  101. // [message] => Informational message
  102. // [priority] => 6
  103. // [priorityName] => INFO
  104. // )
  105. ]]>
  106. </programlisting>
  107. </para>
  108. <para>
  109. 清空有mock记录的日志,设置<code>$mock->events = array()</code>即可.
  110. </para>
  111. </sect2>
  112. <sect2 id="zend.log.writers.compositing">
  113. <title>组合Writers</title>
  114. <para>
  115. 没有复合Writer对象,但是一个Log实例可以有任意个Writer.使用<code>addWriter</code>方法
  116. 添加Writer:
  117. <programlisting role="php"><![CDATA[
  118. $writer1 = new Zend_Log_Writer_Stream('/path/to/first/logfile');
  119. $writer2 = new Zend_Log_Writer_Stream('/path/to/second/logfile');
  120. $logger = new Zend_Log();
  121. $logger->addWriter($writer1);
  122. $logger->addWriter($writer2);
  123. // goes to both writers
  124. $logger->info('Informational message');
  125. ]]>
  126. </programlisting>
  127. </para>
  128. </sect2>
  129. </sect1>