2
0

Zend_Log-Overview.xml 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 22756 -->
  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
  15. Anwendung am meisten benutzt. Man kann soviele Log Objekte haben wie man will;
  16. Sie interagieren nicht. Ein Log Objekt muß mindestens einen Schreiber
  17. beinhalten, und kann optional einen oder mehrere Filter beinhalten.
  18. </para>
  19. </listitem>
  20. <listitem>
  21. <para>
  22. Ein Writer (Abgeleitet von <classname>Zend_Log_Writer_Abstract</classname>) ist
  23. dafür zuständig das Daten in den Speicher geschrieben werden.
  24. </para>
  25. </listitem>
  26. <listitem>
  27. <para>
  28. Ein Filter (implementiert <classname>Zend_Log_Filter_Interface</classname>)
  29. blockiert Logdaten vom gespeichert werden. Ein Filter kann einem individuellen
  30. Writer hinzugefügt werden, oder an ein Log wo er vor allen Writern hinzugefügt
  31. wird. In jedem Fall können Filter verkettet werden.
  32. </para>
  33. </listitem>
  34. <listitem>
  35. <para>
  36. Ein Formatter (implementiert
  37. <classname>Zend_Log_Formatter_Interface</classname>) kann die Logdaten
  38. formatieren bevor diese durch den Writer geschrieben werden. Jeder Writer hat
  39. exakt einen Formatter.
  40. </para>
  41. </listitem>
  42. </itemizedlist>
  43. </para>
  44. <sect2 id="zend.log.overview.creating-a-logger">
  45. <title>Erstellen eines Logs</title>
  46. <para>
  47. Um das protokollieren zu starten, muß ein Writer instanziert werden und einer Log
  48. Instanz übergeben werden:
  49. </para>
  50. <programlisting language="php"><![CDATA[
  51. $logger = new Zend_Log();
  52. $writer = new Zend_Log_Writer_Stream('php://output');
  53. $logger->addWriter($writer);
  54. ]]></programlisting>
  55. <para>
  56. Es ist wichtig anzumerken dass das Log mindestens einen Writer haben muß. Man kann eine
  57. beliebige Anzahl von Writern hinzufügen indem man die
  58. <methodname>addWriter()</methodname> Methode des Log's verwendet.
  59. </para>
  60. <para>
  61. Alternativ kann ein Writer direkt dem Konstruktor von Log, als Abkürzung, übergeben
  62. werden:
  63. </para>
  64. <programlisting language="php"><![CDATA[
  65. $writer = new Zend_Log_Writer_Stream('php://output');
  66. $logger = new Zend_Log($writer);
  67. ]]></programlisting>
  68. <para>
  69. Das Log ist nun fertig zur Verwendung.
  70. </para>
  71. </sect2>
  72. <sect2 id="zend.log.overview.logging-messages">
  73. <title>Nachrichten protokollieren</title>
  74. <para>
  75. Um eine Nachricht zu protokollieren, muß die <methodname>log()</methodname> Methode
  76. einer Log Instanz aufgerufen werden und die Nachricht mit einer entsprechenden Priorität
  77. übergeben werden:
  78. </para>
  79. <programlisting language="php"><![CDATA[
  80. $logger->log('Informative Nachricht', Zend_Log::INFO);
  81. ]]></programlisting>
  82. <para>
  83. Der erste Parameter der <methodname>log()</methodname> Methode ist ein
  84. <property>message</property> String und der zweite Parameter ist ein
  85. <property>priority</property> Integerwert. Die Priorität muß eine der Prioritäten sein
  86. die von der Log Instanz erkannt wird. Das wird in der nächsten Sektion beschrieben.
  87. </para>
  88. <para>
  89. Eine Abkürzung ist auch verfügbar. Statt dem Aufruf der <methodname>log()</methodname>
  90. Methode kann eine Methode des selben Namens wie die Priorität aufgerufen werden:
  91. </para>
  92. <programlisting language="php"><![CDATA[
  93. $logger->log('Informative Nachricht', Zend_Log::INFO);
  94. $logger->info('Informative Nachricht');
  95. $logger->log('Notfall Nachricht', Zend_Log::EMERG);
  96. $logger->emerg('Notfall Nachricht');
  97. ]]></programlisting>
  98. </sect2>
  99. <sect2 id="zend.log.overview.destroying-a-logger">
  100. <title>Ein Log entfernen</title>
  101. <para>
  102. Wenn ein Log Objekt nicht länger benötigt wird, kann die Variable die das Log enthält
  103. auf <constant>NULL</constant> gesetzt werden um es zu entfernen. Das wird automatisch
  104. die Instanzmethode <methodname>shutdown()</methodname> von jedem hinzugefügten Writer
  105. aufrufen bevor das Log Objekt entfernt wird:
  106. </para>
  107. <programlisting language="php"><![CDATA[
  108. $logger = null;
  109. ]]></programlisting>
  110. <para>
  111. Das explizite entfernen des Logs auf diesem Weg ist optional und wird automatisch
  112. durchgeführt wenn <acronym>PHP</acronym> herunterfährt.
  113. </para>
  114. </sect2>
  115. <sect2 id="zend.log.overview.builtin-priorities">
  116. <title>Verwenden von eingebauten Prioritäten</title>
  117. <para>
  118. Die <classname>Zend_Log</classname> Klasse definiert die folgenden Prioritäten:
  119. </para>
  120. <programlisting language="php"><![CDATA[
  121. EMERG = 0; // Notfall: System ist nicht verwendbar
  122. ALERT = 1; // Alarm: Aktionen müßen sofort durchgefüht werden
  123. CRIT = 2; // Kritisch: Kritische Konditionen
  124. ERR = 3; // Fehler: Fehler Konditionen
  125. WARN = 4; // Warnung: Warnungs Konditionen
  126. NOTICE = 5; // Notiz: Normal aber signifikante Kondition
  127. INFO = 6; // Informativ: Informative Nachrichten
  128. DEBUG = 7; // Debug: Debug Nachrichten
  129. ]]></programlisting>
  130. <para>
  131. Diese Prioritäten sind immer vorhanden und eine komfortable Methode für den selben Namen
  132. ist für jede einzelne vorhanden.
  133. </para>
  134. <para>
  135. Die Prioritäten sind nicht beliebig. Die kommen vom BSD syslog Protokoll,
  136. welches in <ulink url="http://tools.ietf.org/html/rfc3164">RFC-3164</ulink> beschrieben
  137. wird. Die Namen und korrespondierenden Prioritätennummern sind auch mit einem anderen
  138. <acronym>PHP</acronym> Logging Systeme kompatibel, <ulink
  139. url="http://pear.php.net/package/log">PEAR Log</ulink>, welches möglicherweise mit
  140. Interoperabilität zwischen Ihm und <classname>Zend_Log</classname> wirbt.
  141. </para>
  142. <para>
  143. Nummern für Prioritäten sinken in der Reihenfolge ihrer Wichtigkeit.
  144. <constant>EMERG</constant> (0) ist die wichtigste Priorität. <constant>DEBUG</constant>
  145. (7) ist die unwichtigste Priorität der eingebauten Prioritäten. Man kann Prioritäten von
  146. niedriger Wichtigkeit als <constant>DEBUG</constant> definieren. Wenn die Priorität für
  147. die Lognachricht ausgewählt wird, sollte auf die Hirarchie der Prioritäten geachtet
  148. werden und selbige sorgfältig ausgewählt werden.
  149. </para>
  150. </sect2>
  151. <sect2 id="zend.log.overview.user-defined-priorities">
  152. <title>Hinzufügen von selbstdefinierten Prioritäten</title>
  153. <para>
  154. Selbstdefinierte Prioritäten können während der Laufzeit hinzugefügt werden durch
  155. Verwenden der <methodname>addPriority()</methodname> Methode des Log's:
  156. </para>
  157. <programlisting language="php"><![CDATA[
  158. $logger->addPriority('FOO', 8);
  159. ]]></programlisting>
  160. <para>
  161. Das obige Codeschnipsel erstellt eine neue Priorität, <constant>FOO</constant>, dessen
  162. Wert '8' ist. Die neue Priorität steht für die Protokollierung zur Verfügung:
  163. </para>
  164. <programlisting language="php"><![CDATA[
  165. $logger->log('Foo Nachricht', 8);
  166. $logger->foo('Foo Nachricht');
  167. ]]></programlisting>
  168. <para>
  169. Neue Prioritäten können bereits bestehende nicht überschreiben.
  170. </para>
  171. </sect2>
  172. <sect2 id="zend.log.overview.understanding-fields">
  173. <title>Log Events verstehen</title>
  174. <para>
  175. Wenn die <methodname>log()</methodname> Methode oder eine Ihrer Abkürzungen aufgerufen
  176. wird, wird ein Log Event erstellt. Das ist einfach ein assoziatives Array mit Daten
  177. welche das Event beschreiben das an die Writer übergeben wird. Die folgenden Schlüssel
  178. werden immer in diesem Array erstellt: <property>timestamp</property>,
  179. <property>message</property>, <property>priority</property>, und
  180. <property>priorityName</property>.
  181. </para>
  182. <para>
  183. Die Erstellung des <property>event</property> Arrays ist komplett transparent. Trotzdem
  184. wird das Wissen über das <property>event</property> Array für das Hinzufügen von
  185. Elementen benötigt, die in dem obigen Standardset nicht existieren.
  186. </para>
  187. <para>
  188. Um ein neues Element für jedes zukünftige Event hinzuzufügen, muß die
  189. <methodname>setEventItem()</methodname> Methode aufgerufen werden wobei ein Schlüssel
  190. und ein Wert übergeben wird:
  191. </para>
  192. <programlisting language="php"><![CDATA[
  193. $logger->setEventItem('pid', getmypid());
  194. ]]></programlisting>
  195. <para>
  196. Das obige Beispiel setzt ein neues Element welches <property>pid</property> heißt und
  197. veröffentlicht es mit der PID des aktuellen Prozesses. Wenn einmal ein neues Element
  198. gesetzt wurde, wird es automatisch für alle Writer verfügbar, zusammen mit allen anderen
  199. Daten der Eventdaten während des Protokollierens. Ein Element kann jederzeit
  200. überschrieben werden durch nochmaligen Aufruf der
  201. <methodname>setEventItem()</methodname> Methode.
  202. </para>
  203. <para>
  204. Das Setzen eines neuen Eventelements mit <methodname>setEventItem()</methodname> führt
  205. dazu dass das neue Element an alle Writer des Loggers gesendet wird. Trotzdem garantiert
  206. das nicht das die Writer das Element aktuell auch aufzeichnet. Und zwar deswegen weil
  207. die Writer nicht wissen was zu tun ist solange das Formatter Objekt nicht über das neue
  208. Element informiert wurde. Siehe in die Sektion über Formatter um mehr darüber zu lernen.
  209. </para>
  210. </sect2>
  211. <sect2 id="zend.log.overview.as-errorHandler">
  212. <title>PHP Fehler loggen</title>
  213. <para>
  214. <classname>Zend_Log</classname> kann auch verwendet werden um <acronym>PHP</acronym>
  215. Fehler zu loggen. Der Aufruf von <methodname>registerErrorHandler()</methodname> fügt
  216. <classname>Zend_Log</classname> vor dem aktuellen Error Handler hinzu, und gibt den
  217. Fehler genauso weiter.
  218. </para>
  219. <table id="zend.log.overview.as-errorHandler.properties.table-1">
  220. <title>Zend_Log Events für PHP Fehler haben ein zusätzliches Feld welches
  221. <methodname>handler (int $errno ,string $errstr [,string $errfile [,int $errline [,array
  222. $errcontext]]])</methodname> von <ulink
  223. url="http://us3.php.net/manual/en/function.set-error-handler.php">set_error_handler</ulink>
  224. entspricht</title>
  225. <tgroup cols="3">
  226. <thead>
  227. <row>
  228. <entry>Name</entry>
  229. <entry>Parameter für den Error Handler</entry>
  230. <entry>Beschreibung</entry>
  231. </row>
  232. </thead>
  233. <tbody>
  234. <row>
  235. <entry>message</entry>
  236. <entry>errstr</entry>
  237. <entry>Enthält die Fehlermeldung als String.</entry>
  238. </row>
  239. <row>
  240. <entry>errno</entry>
  241. <entry>errno</entry>
  242. <entry>Enthält das Level des geworfenen Fehlers als Integer.</entry>
  243. </row>
  244. <row>
  245. <entry>file</entry>
  246. <entry>errfile</entry>
  247. <entry>
  248. Enthält den Dateinamen in dem der Fehler geworfen wurde als String
  249. </entry>
  250. </row>
  251. <row>
  252. <entry>line</entry>
  253. <entry>errline</entry>
  254. <entry>
  255. Enthält die Zeilennummer in welcher der Fehler geworfen wurde als
  256. Integer
  257. </entry>
  258. </row>
  259. <row>
  260. <entry>context</entry>
  261. <entry>errcontext</entry>
  262. <entry>
  263. (Optional) Ein Array welches auf eine aktive Symboltabelle zeigt in
  264. welcher der Fehler aufgetreten ist. In anderen Worden, enthält
  265. errcontext ein Array jeder Variable welche in dem Scope existiert hat
  266. in welchem der Fehler geworfen wurde. Benutzerdefinierte Error Handler
  267. müssen den Error Context nicht verändern.
  268. </entry>
  269. </row>
  270. </tbody>
  271. </tgroup>
  272. </table>
  273. </sect2>
  274. </sect1>