2
0

Zend_Log-Overview.xml 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 17175 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.log.overview">
  5. <title>Übersicht</title>
  6. <para>
  7. <classname>Zend_Log</classname> ist eine Komponente für Mehrzweckprotokollierung. Es
  8. unterstützt vielfache Log Backends, das Senden von formatierten Nachrichten zum Log, und das
  9. Filtern von Nachrichten um nicht protokolliert zu werden. Diese Funktionen sind in die
  10. folgenden Objekte seperiert worden:
  11. <itemizedlist>
  12. <listitem>
  13. <para>
  14. Ein Log (Instanz von <classname>Zend_Log</classname>) ist das Objekt das die Anwendung
  15. am meisten benutzt. Man kann soviele Log Objekte haben wie man will; Sie interagieren
  16. nicht. Ein Log Objekt muß mindestens einen Schreiber beinhalten, und kann optional einen
  17. oder mehrere Filter beinhalten.
  18. </para>
  19. </listitem><listitem>
  20. <para>
  21. Ein Writer (Abgeleitet von <classname>Zend_Log_Writer_Abstract</classname>) ist dafür
  22. zuständig das Daten in den Speicher geschrieben werden.
  23. </para>
  24. </listitem><listitem>
  25. <para>
  26. Ein Filter (implementiert <classname>Zend_Log_Filter_Interface</classname>) blockiert
  27. Logdaten vom gespeichert werden. Ein Filter kann einem individuellen Writer hinzugefügt
  28. werden, oder an ein Log wo er vor allen Writern hinzugefügt wird. In jedem Fall können
  29. Filter verkettet werden.
  30. </para>
  31. </listitem><listitem>
  32. <para>
  33. Ein Formatter (implementiert <classname>Zend_Log_Formatter_Interface</classname>) kann
  34. die Logdaten formatieren bevor diese durch den Writer geschrieben werden. Jeder Writer
  35. hat exakt einen Formatter.
  36. </para>
  37. </listitem>
  38. </itemizedlist>
  39. </para>
  40. <sect2 id="zend.log.overview.creating-a-logger">
  41. <title>Erstellen eines Logs</title>
  42. <para>
  43. Um das protokollieren zu starten, muß ein Writer instanziert werden und einer Log Instanz
  44. übergeben werden:
  45. <programlisting language="php"><![CDATA[
  46. $logger = new Zend_Log();
  47. $writer = new Zend_Log_Writer_Stream('php://output');
  48. $logger->addWriter($writer);
  49. ]]></programlisting>
  50. Es ist wichtig anzumerken das das Log mindestens einen Writer haben muß. Man kann eine
  51. beliebige Anzahl von Writern hinzufügen indem man die <methodname>addWriter()</methodname>
  52. Methode des Log's verwendet.
  53. </para>
  54. <para>
  55. Alternativ kann ein Writer direkt dem Konstruktor von Log, als Abkürzung, übergeben werden:
  56. <programlisting language="php"><![CDATA[
  57. $writer = new Zend_Log_Writer_Stream('php://output');
  58. $logger = new Zend_Log($writer);
  59. ]]></programlisting>
  60. Das Log ist nun fertig zur Verwendung.
  61. </para>
  62. </sect2>
  63. <sect2 id="zend.log.overview.logging-messages">
  64. <title>Nachrichten protokollieren</title>
  65. <para>
  66. Um eine Nachricht zu protokollieren, muß die <methodname>log()</methodname> Methode einer
  67. Log Instanz aufgerufen werden und die Nachricht mit einer entsprechenden Priorität übergeben
  68. werden:
  69. <programlisting language="php"><![CDATA[
  70. $logger->log('Informative Nachricht', Zend_Log::INFO);
  71. ]]></programlisting>
  72. Der erste Parameter der <methodname>log()</methodname> Methode ist ein <code>message</code>
  73. String und der zweite Parameter ist ein <code>priority</code> Integerwert. Die Priorität muß
  74. eine der Prioritäten sein die von der Log Instanz erkannt wird. Das wird in der nächsten
  75. Sektion beschrieben.
  76. </para>
  77. <para>
  78. Eine Abkürzung ist auch verfügbar. Statt dem Aufruf der <methodname>log()</methodname> Methode
  79. kann eine Methode des selben Namens wie die Priorität aufgerufen werden:
  80. <programlisting language="php"><![CDATA[
  81. $logger->log('Informative Nachricht', Zend_Log::INFO);
  82. $logger->info('Informative Nachricht');
  83. $logger->log('Notfall Nachricht', Zend_Log::EMERG);
  84. $logger->emerg('Notfall Nachricht');
  85. ]]></programlisting>
  86. </para>
  87. </sect2>
  88. <sect2 id="zend.log.overview.destroying-a-logger">
  89. <title>Ein Log entfernen</title>
  90. <para>
  91. Wenn ein Log Objekt nicht länger benötigt wird, kann die Variable die das Log enthält auf
  92. <constant>NULL</constant> gesetzt werden um es zu entfernen. Das wird automatisch die
  93. Instanzmethode <methodname>shutdown()</methodname> von jedem hinzugefügten Writer aufrufen
  94. bevor das Log Objekt entfernt wird:
  95. <programlisting language="php"><![CDATA[
  96. $logger = null;
  97. ]]></programlisting>
  98. Das explizite entfernen des Logs auf diesem Weg ist optional und wird automatisch durchgeführt
  99. wenn PHP herunterfährt.
  100. </para>
  101. </sect2>
  102. <sect2 id="zend.log.overview.builtin-priorities">
  103. <title>Verwenden von eingebauten Prioritäten</title>
  104. <para>
  105. Die <classname>Zend_Log</classname> Klasse definiert die folgenden Prioritäten:
  106. <programlisting language="php"><![CDATA[
  107. EMERG = 0; // Notfall: System ist nicht verwendbar
  108. ALERT = 1; // Alarm: Aktionen müßen sofort durchgefüht werden
  109. CRIT = 2; // Kritisch: Kritische Konditionen
  110. ERR = 3; // Fehler: Fehler Konditionen
  111. WARN = 4; // Warnung: Warnungs Konditionen
  112. NOTICE = 5; // Notiz: Normal aber signifikante Kondition
  113. INFO = 6; // Informativ: Informative Nachrichten
  114. DEBUG = 7; // Debug: Debug Nachrichten
  115. ]]></programlisting>
  116. Diese Prioritäten sind immer vorhanden und eine komfortable Methode für den selben Namen ist
  117. für jede einzelne vorhanden.
  118. </para>
  119. <para>
  120. Die Prioritäten sind nicht beliebig. Die kommen vom BSD <code>syslog</code> Protokoll, welches
  121. in <ulink url="http://tools.ietf.org/html/rfc3164">RFC-3164</ulink> beschrieben wird. Die
  122. Namen und korrespondierenden Prioritätennummern sind auch mit einem anderen
  123. <acronym>PHP</acronym> Logging Systeme kompatibel, <ulink
  124. url="http://pear.php.net/package/log">PEAR Log</ulink>, welches möglicherweise mit
  125. Interoperabilität zwischen Ihm und <classname>Zend_Log</classname> wirbt.
  126. </para>
  127. <para>
  128. Nummern für Prioritäten sinken in der Reihenfolge ihrer Wichtigkeit.
  129. <constant>EMERG</constant> (0) ist die wichtigste Priorität. <constant>DEBUG</constant> (7)
  130. ist die unwichtigste Priorität der eingebauten Prioritäten. Man kann Prioritäten von niedriger
  131. Wichtigkeit als <constant>DEBUG</constant> definieren. Wenn die Priorität für die Lognachricht
  132. ausgewählt wird, sollte auf die Hirarchie der Prioritäten geachtet werden und selbige
  133. sorgfältig ausgewählt werden.
  134. </para>
  135. </sect2>
  136. <sect2 id="zend.log.overview.user-defined-priorities">
  137. <title>Hinzufügen von selbstdefinierten Prioritäten</title>
  138. <para>
  139. Selbstdefinierte Prioritäten können wärend der Laufzeit hinzugefügt werden durch verwenden der
  140. <methodname>addPriority()</methodname> Methode des Log's:
  141. <programlisting language="php"><![CDATA[
  142. $logger->addPriority('FOO', 8);
  143. ]]></programlisting>
  144. Das obige Codeschnipsel erstellt eine neue Priorität, <constant>FOO</constant>, dessen Wert
  145. <code>8</code> ist. Die neue Priorität steht für die Protokollierung zur Verfügung:
  146. <programlisting language="php"><![CDATA[
  147. $logger->log('Foo Nachricht', 8);
  148. $logger->foo('Foo Nachricht');
  149. ]]></programlisting>
  150. Neue Prioritäten können bereits bestehende nicht überschreiben.
  151. </para>
  152. </sect2>
  153. <sect2 id="zend.log.overview.understanding-fields">
  154. <title>Log Events verstehen</title>
  155. <para>
  156. Wenn die <methodname>log()</methodname> Methode oder eine Ihrer Abkürzungen aufgerufen wird,
  157. wird ein Log Event erstellt. Das ist einfach ein assoziatives Array mit Daten welche das Event
  158. beschreiben das an die Writer übergeben wird. Die folgenden Schlüssel werden immer in diesem
  159. Array erstellt: <code>timestamp</code>, <code>message</code>, <code>priority</code>, und
  160. <code>priorityName</code>.
  161. </para>
  162. <para>
  163. Die Erstellung des <code>event</code> Arrays ist komplett transparent. Trotzdem wird das
  164. Wissen über das <code>event</code> Array für das Hinzufügen von Elementen benötigt, die in dem
  165. obigen Standardset nicht existieren.
  166. </para>
  167. <para>
  168. Um ein neues Element für jedes zukünftige Event hinzuzufügen, muß die
  169. <methodname>setEventItem()</methodname> Methode aufgerufen werden wobei ein Schlüssel und ein
  170. Wert übergeben wird:
  171. <programlisting language="php"><![CDATA[
  172. $logger->setEventItem('pid', getmypid());
  173. ]]></programlisting>
  174. Das obige Beispiel setzt ein neues Element welches <code>pid</code> heißt und veröffentlicht
  175. es mit der PID des aktuellen Prozesses. Wenn einmal ein neues Element gesetzt wurde, wird es
  176. automatisch für alle Writer verfügbar, zusammen mit allen anderen Daten der Eventdaten wärend
  177. des Protokollierens. Ein Element kann jederzeit überschrieben werden durch nochmaligen Aufruf
  178. der <methodname>setEventItem()</methodname> Methode.
  179. </para>
  180. <para>
  181. Das Setzen eines neuen Eventelements mit <methodname>setEventItem()</methodname> führt dazu
  182. das das neue Element an alle Writer des Loggers gesendet wird. Trotzdem garantiert das nicht
  183. das die Writer das Element aktuell auch aufzeichnet. Und zwar deswegen weil die Writer nicht
  184. wissen was zu tun ist solange das Formatter Objekt nicht über das neue Element informiert
  185. wurde. Siehe in die Sektion über Formatter um mehr darüber zu lernen.
  186. </para>
  187. </sect2>
  188. </sect1>