Разрабатываем ваш первый логгер
Для начала давайте разберемся, как создавать обычный логгер. Для осуществления задуманного необходимо инициализировать Zend_Log класс и добавить генератор в объект. Будем использовать генератор логов для файловой системы. Zend_Log_Writer_Stream – класс, который мы задействуем для записи логов. В качестве параметров конструктора этого класса будем передавать путь сохранения логов.
Код – приведенный ниже – пример создания логгера и добавления генератора логов. При инициализации Zend_Log можно подгрузить несколько дополнительных генераторов логов (таких как new Zend_Log(new Zend_Log_Writer_Stream(...))).
<?php
require_once('Zend/Log.php');
require_once('Zend/Log/Writer/Stream.php');
$logger = new Zend_Log();
$writer = new Zend_Log_Writer_Stream('sample.log');
$logger->addWriter($writer);
$logger->log('sample message!', Zend_Log::INFO);
?>
Данный код завершается вызовом метода log() объекта Zend_Log, что приведет к записи сообщения в лог. Ниже приведен результат выполнения данного кода:
$ cat sample.log
2009-04-11T14:47:20+09:00 INFO (6): sample message!
Запись событий
Как было отмечено в первой части статьи, для записи сообщения в лог используется метод log(). Первым параметром, которого выступает сохраняемое сообщение, а в качестве второго используется приоритет сообщения.
Список приоритетов по умолчанию:
Zend_Log::EMERG: Emergency: неопределенная ошибка
Zend_Log::ALERT: Alert: действие должно быть выполнено немедленно
Zend_Log::CRIT: Critical: критическая ситуация
Zend_Log::ERR: Error: ошибка
Zend_Log::WARN: Warning: предупреждение
Zend_Log::NOTICE: Notice: оповещение
Zend_Log::INFO: Informational: информационное сообщение
Zend_Log::DEBUG: Debug: отладка
Вы можете использовать любую из этих констант в качестве второго аргумента log(), либо вы можете воспользоваться одним из вспомогательных методов Zend_Log. Ранее мы использовали $logger->log('message', Zend_Logger::INFO), но в Zend_Log применяется также короткий вызов $logger->info('message').
Сообщения с другими приоритетами так же могут быть записаны в данном стиле. Например, $logger->warn('Some Warning') вместо $logger->log('Some Warning', Zend_Log::WARN).
Вы можете создавать собственные константы приоритетов, используя метод addPriority().
Фильтр событий
Если вам необходимо, чтобы генератор логов выводил сообщения только определенного типа, вы можете воспользоваться фильтром по приоритетам. Данная возможность будет полезна, если вам, например, нужно записывать только информационный сообщения и данные об ошибках.
Фильтрация событий осуществляется средствами класса Zend_Log_Filter_Priority. Вы можете использовать данный класс для фильтрации сообщений создаваемых определенным генератором, либо системой логгирования в целом. После создания фильтра вы можете добавить его к любому генератору методом addFilter().
<?php
require_once('Zend/Log.php');
require_once('Zend/Log/Writer/Stream.php');
// create the logger
$logger = new Zend_Log();
// create the writer
$writer = new Zend_Log_Writer_Stream('filters.log');
// create the priority filter
$filter = new Zend_Log_Filter_Priority(Zend_Log::CRIT);
// add the filter to the writer
$writer->addFilter($filter);
// add the writer to the logger
$logger->addWriter($writer);
// record messages
$logger->info('info message');
$logger->crit('critical message');
?>
Если посмотреть на лог, генерируемый данным приложением, то видно, что записываются только сообщения о критических ошибках.
$ cat filters.log
2009-04-11T15:01:52+09:00 CRIT (2): critical message
Отладка кода с помощью Firebug и FirePHP
Zend_Log содержит генератор, который может записывать логи прямо в заголовок вашей web страницы, что позволяет плагину Firebug браузера Firefox их перехватывать и публиковать через свой интерфейс. Это может оказаться очень удобным при разработке или отладке скрипта.
Для вывода сообщений логов таким образом, необходимо использовать класс Zend_Log_Writer_Firebug.
<?php
require_once('Zend/Log.php');
require_once('Zend/Log/Writer/Firebug.php');
$writer = new Zend_Log_Writer_Firebug();
$logger = new Zend_Log($writer);
$logger->info('info message');
$logger->warn('warning message');
$logger->err('error message');
?>
Отправка сообщений
Если вы используете Zend_Controller_Front для управления запросами к вашему сайту, в этом случае любой журнал логов будет автоматически перенаправлен на браузер в HTTP-заголовки.
В противном случае, вам необходимо вручную отправлять их по назначению. Класс Zend_Log_Writer_Firebug взаимодействует с компонентом Zend_Wildfire, потому вам необходимо сообщить данному классу о возможности вставки HTTP-заголовков.
Для разработки скрипта нужно использовать классы Zend_Controller_Request_Http и Zend_Controller_Response_Http и передать запрос в Zend_Wildfire. Как только запрос будет обработан, Zend_Wildfire перезапишет HTTP-заголовки добавив сообщения логов.
Код ниже, демонстрирует программную реализацию вышеописанного алгоритма.
<?php
require_once('Zend/Log.php');
require_once('Zend/Log/Writer/Firebug.php');
require_once('Zend/Controller/Response/Http.php');
require_once('Zend/Controller/Request/Http.php');
// create the logger and log writer
$writer = new Zend_Log_Writer_Firebug();
$logger = new Zend_Log($writer);
// get the wildfire channel
$channel = Zend_Wildfire_Channel_HttpHeaders::getInstance();
// create and set the HTTP response
$response = new Zend_Controller_Response_Http();
$channel->setResponse($response);
// create and set the HTTP request
$channel->setRequest(new Zend_Controller_Request_Http());
// record log messages
$logger->info('info message');
$logger->warn('warning message');
$logger->err('error message');
// insert the wildfire headers into the HTTP response
$channel->flush();
// send the HTTP response headers
$response->sendHeaders();
?>





