Как зарегистрировать Zend_Log в загрузчике приложения ZF 1.8+? - PullRequest
13 голосов
/ 16 ноября 2009

Итак, я хочу начать регистрироваться в моем приложении Zend Framework. Я хочу зарегистрировать регистратор где-нибудь в моей начальной загрузке, чтобы я мог легко получить к нему доступ из любого действия контроллера. Я думаю, что это должно быть простым делом, которое было сделано раньше, но как я могу это сделать?

Документация показывает что-то вроде этого, но я не хочу создавать новый Zend_Log каждый раз, когда я хочу что-то регистрировать:

$writer = new Zend_Log_Writer_Stream('/path/to/my/log/file');
$logger = new Zend_Log($writer);
$logger->log('Informational message', Zend_Log::INFO);

Решение

Это то, что я придумал. Спасибо за напоминание о Zend_Registry!

// in /application/Bootstrap.php
protected function _initLogger()
{
    $writer = new Zend_Log_Writer_Stream('php://output');
    $logger = new Zend_Log($writer);
    Zend_Registry::set('logger', $logger);
}

// in controller actions
$logger = Zend_Registry::get('logger');
$logger->log('message');

Ответы [ 4 ]

7 голосов
/ 16 ноября 2009

Самое простое - использовать Zend_Registry для хранения журнала

Используйте это внутри вашей начальной загрузки

Zend_Registry::set('log', $log);

и используйте его для извлечения журнала

Zend_Registry::get('log')
5 голосов
/ 21 июля 2011

Я сделал почти то же самое, но записал в БД. Вот мой код, который я поместил в Bootstrap

public function _initLogger(){

    $resource = $this->getPluginResource('db');
$dbAdapter = $resource->getDbAdapter();
    $columnMapping = array(
        'level' => 'priorityName',
        'priority' => 'priority',
        'message' => 'message',
        'created' => 'timestamp',
        'user_agent'=> 'user_agent',
        'get_vars' => 'get_vars',
        'post_vars' => 'post_vars',
        'ip' => 'ip'
    );

    $writerDb = new Zend_Log_Writer_Db($dbAdapter, 'tbl_history', $columnMapping);
    $logger = new Zend_Log($writerDb);

    $logger->setEventItem('datetime',date('Y-m-d H:i:s'));
    $logger->setEventItem('user_agent',$_SERVER['HTTP_USER_AGENT']);
    $logger->setEventItem('get_vars',print_r($_GET,true));
    $logger->setEventItem('post_vars',print_r($_POST,true));
    $logger->setEventItem('ip',$_SERVER['REMOTE_ADDR']);

    Zend_Registry::set('logger', $logger);

}

И доступ к нему из любого места, как:

Zend_Registry::get('logger')->log('log emergency message', Zend_Log::EMERG);
Zend_Registry::get('logger')->info('just logging some information');

Надеюсь, это поможет;)

2 голосов
/ 13 декабря 2009

Как это возможно;

/*
 * In case of need to change Log object
 * 
 * $options['writer'] = Zend_Log_Writer_...();
 * 
 * @param array $options Configuration options
 */
protected function _initLog(array $options = array())
{
    $writer = new Zend_Log_Writer_Null();

    if(array_key_exists('writer', $options))
    {
        if($options['writer'] instanceof Zend_Log_Writer_Abstract)  {
            $writer = $options['writer'];
        }
        else    {
            if(class_exists($options['writer']))    {
                $writer = new $options['writer'];
            }
            else    {
                throw new H2B_Exception("Writer class not found", H2B_Messages_Generic::OBJECT_NOT_FOUND);
            }
        }
    }

    $logger = new Zend_Log($writer);

    return $logger;
}
1 голос
/ 17 ноября 2009

Только что написав класс журналирования, возможно, поделившись тем, что я сделал, вы получите некоторые идеи ...

Из index.php (на ZF 1.62) я вызываю статический метод из класса в моей библиотеке, он определяет, находитесь ли вы в dev или выше, а затем выдает соответствующий логгер. В dev он будет входить в Firebug, на этапе + он будет входить в файл ... Я планирую добавить аварийный регистратор, который будет отправлять оповещения по электронной почте о плохих событиях, например, о неудачном запросе, который может указывать на попытку ввода в dB ...

Затем в моем базовом контроллере, из которого выходят все контроллеры, я вызываю регистратор. Таким образом, для всех действий требуется только одна строка для связи с регистратором ... например. $ Это -> _ logger-> отладки ( 'тест');

Сохранение одной строки может показаться не таким уж большим делом, но когда вы просто выплевываете отладочные сообщения, которые планируете удалить минуту спустя, очень раздражает запоминание синтаксиса и ввод обоих ...

Кроме того, выплевывая в firebug, вам не нужно сразу разбираться с макетом или удалять отладочное сообщение, так как оно никогда не будет отображаться в работе.

...