<?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: 17173 -->
<!-- Reviewed: no -->
<sect1 id="zend.log.writers" xmlns:xi="http://www.w3.org/2001/XInclude">
    <title>Rédacteurs (Writers)</title>

    <para>
        Un rédacteur est un objet qui hérite de
        <classname>Zend_Log_Writer_Abstract</classname>. La responsabilité d'un rédacteur est
        d'enregistrer des données de log dans un stockage particulier.
    </para>

    <sect2 id="zend.log.writers.stream">
        <title>Écrire vers un flux (stream)</title>

        <para>
            <classname>Zend_Log_Writer_Stream</classname> envoie des données de log à un
            <ulink url="http://www.php.net/stream">flux de <acronym>PHP</acronym></ulink>.
        </para>

        <para>
            Pour écrire des données de log dans le buffer d'affichage de PHP, il faut utiliser
            l'URL <code>php://output</code>. Alternativement, vous pouvez préférer envoyer des
            données de log directement à un flux comme <constant>STDERR</constant>
            (<code>php://stderr</code>). <programlisting language="php"><![CDATA[
$redacteur = new Zend_Log_Writer_Stream('php://output');
$logger = new Zend_Log($redacteur);

$logger->info("Message d'information");
]]></programlisting></para>

        <para>
            Pour écrire des données dans un fichier, employer un des <ulink
            url="http://www.php.net/manual/fr/wrappers.php#wrappers.file">Filesystem URLs</ulink>:
            <programlisting language="php"><![CDATA[
$redacteur = new Zend_Log_Writer_Stream('/chemin/vers/fichierdelog');
$logger = new Zend_Log($redacteur);

$logger->info("Message d'information");
]]></programlisting> Par défaut, le flux s'ouvre en mode d'ajout (<code>"a"</code>). Pour
            l'ouvrir avec un mode différent, le constructeur de
            <classname>Zend_Log_Writer_Stream</classname> accepte un deuxième paramètre facultatif
            pour le mode.
        </para>

        <para>
            Le constructeur de <classname>Zend_Log_Writer_Stream</classname> accepte également
            une ressource existante de flux : <programlisting language="php"><![CDATA[
$flux = @fopen('/chemin/vers/fichierdelog', 'a', false);
if (! $flux) {
    throw new Exception('Impossible d\'ouvrir le flux');
}

$redacteur = new Zend_Log_Writer_Stream($flux);
$logger = new Zend_Log($redacteur);

$logger->info("Message d'information");
]]></programlisting> Vous ne pouvez pas indiquer le mode pour des ressources existantes de flux.
            Le faire entraînera une <classname>Zend_Log_Exception</classname>.
        </para>
    </sect2>

    <sect2 id="zend.log.writers.database">
        <title>Écrire dans des bases de données</title>

        <para>
            <classname>Zend_Log_Writer_Db</classname> écrit les informations de log dans une
            table de base de données en utilisant <classname>Zend_Db</classname>. Le constructeur de
            <classname>Zend_Log_Writer_Db</classname> reçoit une instance de
            <classname>Zend_Db_Adapter</classname>, un nom de table, et un plan de correspondance
            entre les colonnes de la base de données et les données élémentaires d'événement :
            <programlisting language="php"><![CDATA[
$parametres = array ('host'     => '127.0.0.1',
                 'username' => 'malory',
                 'password' => '******',
                 'dbname'   => 'camelot');
$db = Zend_Db::factory('PDO_MYSQL', $parametres);

$planDeCorrespondance = array('niveau' => 'priority', 'msg' => 'message');
$redacteur = new Zend_Log_Writer_Db($db,
                                    'nom_de_la_table_de_log',
                                    $planDeCorrespondance);

$logger = new Zend_Log($redacteur);

$logger->info("Message d'information");
]]></programlisting> L'exemple ci-dessus écrit une ligne unique de données de log dans la table
            appelée <code>nom_de_la_table_de_log</code>. La colonne de base de données appelée
            <code>niveau</code> reçoit le niveau de priorité et la colonne appelée <code>msg</code>
            reçoit le message de log.
        </para>
    </sect2>

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

    <sect2 id="zend.log.writers.null">
        <title>Déraciner les rédacteurs</title>

        <para>
            Le <classname>Zend_Log_Writer_Null</classname> est une souche qui écrit des
            données de log nulle part. Il est utile pour neutraliser le log ou déraciner le log
            pendant les essais :<programlisting language="php"><![CDATA[
$redacteur = new Zend_Log_Writer_Null;
$logger = new Zend_Log($redacteur);

// va nulle part
$logger->info("Message d'information");
]]></programlisting></para>
        </sect2>

        <sect2 id="zend.log.writers.mock">
            <title>Tester avec un simulacre</title>

        <para>
            Le <classname>Zend_Log_Writer_Mock</classname> est un rédacteur très simple qui
            enregistre les données brutes qu'il reçoit dans un tableau exposé comme propriété
            publique. <programlisting language="php"><![CDATA[
$simulacre = new Zend_Log_Writer_Mock;
$logger = new Zend_Log($simulacre);

$logger->info("Message d'information");

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

// Array
// (
//    [timestamp] => 2007-04-06T07:16:37-07:00
//    [message] => Message d'information
//    [priority] => 6
//    [priorityName] => INFO
// )
]]></programlisting></para>

        <para>
            Pour effacer les événements notés dans le simulacre, il faut simplement réaliser
            <code>$simulacre-&gt;events = array()</code>.
        </para>
    </sect2>

    <sect2 id="zend.log.writers.compositing">
        <title>Additionner les rédacteurs</title>

        <para>
            Il n'y a aucun objet composite de rédacteurs. Cependant, une instance
            d'enregistreur peut écrire vers tout nombre de rédacteurs. Pour faire ceci, employer la
            méthode <methodname>addWriter()</methodname> : <programlisting language="php"><![CDATA[
$redacteur1 =
    new Zend_Log_Writer_Stream('/chemin/vers/premier/fichierdelog');
$redacteur2 =
    new Zend_Log_Writer_Stream('/chemin/vers/second/fichierdelog');

$logger = new Zend_Log();
$logger->addWriter($redacteur1);
$logger->addWriter($redacteur2);

// va dans les 2 rédacteurs
$logger->info("Message d'information");
]]></programlisting></para>
        </sect2>
    </sect1>