<?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: 24249 -->
<!-- Reviewed: no -->
<sect1 id="zend.log.writers" xmlns:xi="http://www.w3.org/2001/XInclude">
    <title>Writer</title>

    <para>
        Ein Writer ist ein Objekt das von <classname>Zend_Log_Writer_Abstract</classname> abstammt.
        Die Aufgabe eines Writer's ist es Log Daten in ein Speicher-Backend aufzunehmen.
    </para>

    <sect2 id="zend.log.writers.stream">
        <title>In Streams schreiben</title>

        <para>
            <classname>Zend_Log_Writer_Stream</classname> sendet Log Daten in einen
            <ulink url="http://www.php.net/stream">PHP Stream</ulink>.
        </para>

        <para>
            Um Log Daten in den <acronym>PHP</acronym> Ausgabebuffer zu schreiben, muß die URL
            <filename>php://output</filename> verwendet werden. Alternativ können Log Daten direkt
            an einen Stream wie z.B. <constant>STDERR</constant> (<filename>php://stderr</filename>)
            gesendet werden.
        </para>

        <programlisting language="php"><![CDATA[
$writer = new Zend_Log_Writer_Stream('php://output');
$logger = new Zend_Log($writer);

$logger->info('Informational message');
]]></programlisting>

        <para>
            Um Daten in eine Datei zu schreiben, muß eine der
            <ulink url="http://www.php.net/manual/de/wrappers.php#wrappers.file">Dateisystem
            URLs</ulink> verwendet werden:
        </para>

        <programlisting language="php"><![CDATA[
$writer = new Zend_Log_Writer_Stream('/path/to/logfile');
$logger = new Zend_Log($writer);

$logger->info('Informative Nachricht');
]]></programlisting>

        <para>
            Standardmäßig wird der Stream im Anhänge-Modus geöffnet ("a"). Um Ihn in
            einem anderen Modus zu öffnen, akzeptiert der
            <classname>Zend_Log_Writer_Stream</classname> Konstruktor einen optionalen zweiten
            Parameter für den Modus.
        </para>

        <para>
            Der Konstruktor von <classname>Zend_Log_Writer_Stream</classname> akzeptiert auch eine
            existierende Stream Ressource:
        </para>

        <programlisting language="php"><![CDATA[
$stream = @fopen('/path/to/logfile', 'a', false);
if (! $stream) {
    throw new Exception('Stream konnte nicht geöffnet werden');
}

$writer = new Zend_Log_Writer_Stream($stream);
$logger = new Zend_Log($writer);

$logger->info('Informative Nachricht');
]]></programlisting>

        <para>
            Der Modus kann für existierende Stream Ressourcen nicht definiert werden. Wenn das
            gemacht versucht wird, wird eine <classname>Zend_Log_Exception</classname> geworfen.
        </para>
    </sect2>

    <sect2 id="zend.log.writers.database">
        <title>In Datenbanken schreiben</title>

        <para>
            <classname>Zend_Log_Writer_Db</classname> schreibt Log Informationen in eine Datenbank
            Tabelle wobei <classname>Zend_Db</classname> verwendet wird. Der Konstrukor von
            <classname>Zend_Log_Writer_Db</classname> benötigt eine
            <classname>Zend_Db_Adapter</classname> Instanz, einen Tabellennamen, und ein Abbild der
            Datenbankspalten zu den Elementen der Eventdaten:
        </para>

        <programlisting language="php"><![CDATA[
$params = array ('host'     => '127.0.0.1',
                 'username' => 'malory',
                 'password' => '******',
                 'dbname'   => 'camelot');
$db = Zend_Db::factory('PDO_MYSQL', $params);

$columnMapping = array('lvl' => 'priority', 'msg' => 'message');
$writer = new Zend_Log_Writer_Db($db, 'log_table_name', $columnMapping);

$logger = new Zend_Log($writer);

$logger->info('Informative Nachricht');
]]></programlisting>

        <para>
            Das obige Beispiel schreibt eine einzelne Zeile von Log Daten in einem Datenbanktabelle
            welche 'log_table_name' Tabelle benannt wird. Die Datenbankspalte welche 'lvl' benannt
            ist empfängt die Nummer der Priorität und die Spalte welche 'msg' benannt ist empfängt
            die Log Nachricht.
        </para>
    </sect2>

    <xi:include href="Zend_Log-Writers-Firebug.xml" />
    <xi:include href="Zend_Log-Writers-Mail.xml" />
    <xi:include href="Zend_Log-Writers-Syslog.xml" />
    <xi:include href="Zend_Log-Writers-ZendMonitor.xml" />

    <sect2 id="zend.log.writers.null">
        <title>Einen Writer abstumpfen</title>

        <para>
            <classname>Zend_Log_Writer_Null</classname> ist ein Stumpf der keine Log Daten
            irgendwohin schreibt. Er ist nützlich um die Protokollierung auszuschalten oder während
            Tests abzustumpfen:
        </para>

        <programlisting language="php"><![CDATA[
$writer = new Zend_Log_Writer_Null;
$logger = new Zend_Log($writer);

// geht nirgendwohin
$logger->info('Informative Nachricht');
]]></programlisting>
    </sect2>

    <sect2 id="zend.log.writers.mock">
        <title>Mit der Attrappe testen</title>

        <para>
            <classname>Zend_Log_Writer_Mock</classname> ist ein sehr einfacher Writer der die rohen
            Daten die er empfängt aufnimmt und in einem Array als öffentliche Eigenschaft zur
            Verfügung stellt.
        </para>

        <programlisting language="php"><![CDATA[
$mock = new Zend_Log_Writer_Mock;
$logger = new Zend_Log($mock);

$logger->info('Informative Nachricht');

var_dump($mock->events[0]);

// Array
// (
//    [timestamp] => 2007-04-06T07:16:37-07:00
//    [message] => Informative Nachricht
//    [priority] => 6
//    [priorityName] => INFO
// )
]]></programlisting>

        <para>
            Um die Events die von der Attrappe protokolliert wurden zu entfernen, muß einfach
            <command>$mock->events = array()</command> gesetzt werden.
        </para>
    </sect2>

    <sect2 id="zend.log.writers.compositing">
        <title>Gemischte Writer</title>

        <para>
            Es gibt kein gemischtes Writer Objekt. Trotzdem kann eine Log Instanz in jede beliebige
            Anzahl von Writern schreiben. Um das zu tun, muß die
            <methodname>addWriter()</methodname> Methode verwendet werden:
        </para>

        <programlisting language="php"><![CDATA[
$writer1 = new Zend_Log_Writer_Stream('/path/to/first/logfile');
$writer2 = new Zend_Log_Writer_Stream('/path/to/second/logfile');

$logger = new Zend_Log();
$logger->addWriter($writer1);
$logger->addWriter($writer2);

// Geht zu beiden Writern
$logger->info('Informative Nachricht');
]]></programlisting>
    </sect2>
</sect1>
