Programmer's Reference Guide
| Présentation |
Rédacteurs (Writers)
Un rédacteur est un objet qui hérite de Zend_Log_Writer_Abstract. La responsabilité d'un rédacteur est d'enregistrer des données de log dans un stockage particulier.
Écrire vers un flux (stream)
Zend_Log_Writer_Stream envoie des données de log à un » flux de PHP.
Pour écrire des données de log dans le buffer d'affichage de PHP, il faut utiliser
l'URL php://output. Alternativement, vous pouvez préférer envoyer des
données de log directement à un flux comme STDERR
(php://stderr).
$redacteur = new Zend_Log_Writer_Stream('php://output');
$logger = new Zend_Log($redacteur);
$logger->info("Message d'information");
Pour écrire des données dans un fichier, employer un des » Filesystem URLs:
$redacteur = new Zend_Log_Writer_Stream('/chemin/vers/fichierdelog');
$logger = new Zend_Log($redacteur);
$logger->info("Message d'information");
"a"). Pour
l'ouvrir avec un mode différent, le constructeur de
Zend_Log_Writer_Stream accepte un deuxième paramètre facultatif
pour le mode.
Le constructeur de Zend_Log_Writer_Stream accepte également une ressource existante de flux :
$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");
Écrire dans des bases de données
Zend_Log_Writer_Db écrit les informations de log dans une table de base de données en utilisant Zend_Db. Le constructeur de Zend_Log_Writer_Db reçoit une instance de Zend_Db_Adapter, 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 :
$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");
nom_de_la_table_de_log. La colonne de base de données appelée
niveau reçoit le niveau de priorité et la colonne appelée msg
reçoit le message de log.
Écrire vers Firebug
Zend_Log_Writer_Firebug envoie des données d'historisation vers la » console Firebug.

Toutes les données sont envoyées via le composant Zend_Wildfire_Channel_HttpHeaders qui utilise les en-têtes HTTP pour s'assurer que le contenu de la page n'est pas perturbé. Déboguer les requêtes AJAX qui requière du JSON "propre" ou un réponse XML est possible avec cette approche.
Éléments requis :
-
Navigateur Firefox idéalement en version 3 mais la version 2 est aussi supportée.
-
L'extension Firefox nommée Firebug qui peut être téléchargée à cette adresse » https://addons.mozilla.org/en-US/firefox/addon/1843.
-
L'extension Firefox nommée FirePHP ui peut être téléchargée à cette adresse » https://addons.mozilla.org/en-US/firefox/addon/6149.
Exemple #1 Journaliser avec Zend_Controller_Front
// Placez ceci dans votre fichier d'amorçage
// avant de distribuer votre contrôleur frontal
$writer = new Zend_Log_Writer_Firebug();
$logger = new Zend_Log($writer);
// Utiliser ceci dans vos fichiers de modèles, vues et contrôleurs
$logger->log('Ceci est un message de log !', Zend_Log::INFO);
Exemple #2 Journaliser sans Zend_Controller_Front
$writer = new Zend_Log_Writer_Firebug();
$logger = new Zend_Log($writer);
$request = new Zend_Controller_Request_Http();
$response = new Zend_Controller_Response_Http();
$channel = Zend_Wildfire_Channel_HttpHeaders::getInstance();
$channel->setRequest($request);
$channel->setResponse($response);
// Démarrer l'output buffering
ob_start();
// Maintenant vous pouvez appeler le logguer
$logger->log('Ceci est un message de log !', Zend_Log::INFO);
// Envoi des données d'historisation vers le navigateur
$channel->flush();
$response->sendHeaders();
Paramétrer les styles pour les priorités
Les priorités incorporées et celles définies par l'utilisateur peuvent être
stylisées avec la méthode setPriorityStyle().
$logger->addPriority('FOO', 8);
$writer->setPriorityStyle(8, 'TRACE');
$logger->foo('Foo Message');
Le style par défaut pour les priorités définies par l'utilisateur peut être
paramétrer avec la méthode setDefaultPriorityStyle().
$writer->setDefaultPriorityStyle('TRACE');
Les styles supportés sont les suivants :
| Style | Description |
|---|---|
LOG |
Affiche un message d'historisation basique |
INFO |
Affiche un message d'historisation de type information |
WARN |
Affiche un message d'historisation de type avertissement |
ERROR |
Affiche un message d'historisation de type erreur (celui-ci incrémente le compteur d'erreur de Firebug) |
TRACE |
Affiche un message d'historisation avec une trace extensible |
EXCEPTION |
Affiche un message d'historisation de type erreur avec une trace extensible |
TABLE |
Affiche un message d'historisation avec une table extensible |
Préparer les données pour l'historisation
Toute variable PHP peut être journalisée avec les priorités incorporées, un formatage spécial est requis si vous utilisez des styles d'historisation un peu plus spécialisé.
Les styles LOG, INFO, WARN,
ERROR et TRACE ne requièrent pas de formatage spécial.
Historisation des exceptions
Pour journaliser une Zend_Exception, fournissez simplement l'objet exception au logguer. Il n'y a pas d'importance sur la priorité ou le style que vous avez fourni puisque l'exception est automatiquement reconnue.
$exception = new Zend_Exception('Test d\'exception');
$logger->err($exception);
Historisation sous forme de tableau
Vous pouvez aussi journaliser des données en les formatant comme un tableau. Les colonnes sont automatiquement reconnues et la première ligne de données devient automatiquement la ligne d'en-têtes.
$writer->setPriorityStyle(8, 'TABLE');
$logger->addPriority('TABLE', 8);
$table = array('Ligne de résumé pour la table',
array(
array('Colonne 1', 'Colonne 2'),
array('Ligne 1 c 1',' Ligne 1 c 2'),
array('Ligne 2 c 1',' Ligne 2 c 2')
)
);
$logger->table($table);
Writing to Email
Zend_Log_Writer_Mail writes log entries in an email message by using Zend_Mail. The Zend_Log_Writer_Mail constructor takes a Zend_Mail object, and an optional Zend_Layout object.
The primary use case for Zend_Log_Writer_Mail is notifying developers, systems administrators, or any concerned parties of errors that might be occurring with PHP-based scripts. Zend_Log_Writer_Mail was born out of the idea that if something is broken, a human being needs to be alerted of it immediately so they can take corrective action.
Basic usage is outlined below:
$mail = new Zend_Mail();
$mail->setFrom('errors@example.org')
->addTo('project_developers@example.org');
$writer = new Zend_Log_Writer_Mail($mail);
// Set subject text for use; summary of number of errors is appended to the
// subject line before sending the message.
$writer->setSubjectPrependText('Errors with script foo.php');
// Only email warning level entries and higher.
$writer->addFilter(Zend_Log::WARN);
$log = new Zend_Log();
$log->addWriter($writer);
// Something bad happened!
$log->error('unable to connect to database');
// On writer shutdown, Zend_Mail::send() is triggered to send an email with
// all log entries at or above the Zend_Log filter level.
Zend_Log_Writer_Mail will render the email body as plain text by default.
One email is sent containing all log entries at or above the filter level. For example, if warning-level entries an up are to be emailed, and two warnings and five errors occur, the resulting email will contain a total of seven log entries.
Zend_Layout Usage
A Zend_Layout instance may be used to generate the HTML portion of a multipart email. If a Zend_Layout instance is in use, Zend_Log_Writer_Mail assumes that it is being used to render HTML and sets the body HTML for the message as the Zend_Layout-rendered value.
When using Zend_Log_Writer_Mail with a
Zend_Layout instance, you have the option to set a
custom formatter by using the setLayoutFormatter()
method. If no Zend_Layout-specific entry formatter was
specified, the formatter currently in use will be used. Full usage
of Zend_Layout with a custom formatter is outlined
below.
$mail = new Zend_Mail();
$mail->setFrom('errors@example.org')
->addTo('project_developers@example.org');
// Note that a subject line is not being set on the Zend_Mail instance!
// Use a simple Zend_Layout instance with its defaults.
$layout = new Zend_Layout();
// Create a formatter that wraps the entry in a listitem tag.
$layoutFormatter = new Zend_Log_Formatter_Simple(
'<li>' . Zend_Layout::DEFAULT_FORMAT . '</li>'
);
$writer = new Zend_Log_Writer_Mail($mail, $layout);
// Apply the formatter for entries as rendered with Zend_Layout.
$writer->setLayoutFormatter($layoutFormatter);
$writer->setSubjectPrependText('Errors with script foo.php');
$writer->addFilter(Zend_Log::WARN);
$log = new Zend_Log();
$log->addWriter($writer);
// Something bad happened!
$log->error('unable to connect to database');
// On writer shutdown, Zend_Mail::send() is triggered to send an email with
// all log entries at or above the Zend_Log filter level. The email will
// contain both plain text and HTML parts.
Subject Line Error Level Summary
The setSubjectPrependText() method may be used in place
of Zend_Mail::setSubject() to have the email subject
line dynamically written before the email is sent. For example, if
the subject prepend text reads "Errors from script", the subject of
an email generated by Zend_Log_Writer_Mail with two
warnings and five errors would be "Errors from script (warn = 2;
error = 5)". If subject prepend text is not in use via
Zend_Log_Writer_Mail, the Zend_Mail
subject line, if any, is used.
Caveats
Sending log entries via email can be dangerous. If error conditions are being improperly handled by your script, or if you're misusing the error levels, you might find yourself in a situation where you are sending hundreds or thousands of emails to the recipients depending on the frequency of your errors.
At this time, Zend_Log_Writer_Mail does not provide any mechanism for throttling or otherwise batching up the messages. Such functionallity should be implemented by the consumer if necessary.
Again, Zend_Log_Writer_Mail's primary goal is to proactively notify a human being of error conditions. If those errors are being handled in a timely fashion, and safeguards are being put in place to prevent those circumstances in the future, then email-based notification of errors can be a valuable tool.
Déraciner les rédacteurs
Le Zend_Log_Writer_Null 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 :
$redacteur = new Zend_Log_Writer_Null;
$logger = new Zend_Log($redacteur);
// va nulle part
$logger->info("Message d'information");
Tester avec un simulacre
Le Zend_Log_Writer_Mock 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.
$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
// )
Pour effacer les événements notés dans le simulacre, il faut simplement réaliser
$simulacre->events = array().
Additionner les rédacteurs
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 addWriter() :
$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");
| Présentation |
