Ответ 1
Самый простой способ - использовать Zend_Registry для хранения журнала
Используйте это в своей начальной загрузке
Zend_Registry::set('log', $log);
и использовать это для извлечения журнала
Zend_Registry::get('log')
Итак, я хочу начать регистрацию в моем приложении 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');
Самый простой способ - использовать Zend_Registry для хранения журнала
Используйте это в своей начальной загрузке
Zend_Registry::set('log', $log);
и использовать это для извлечения журнала
Zend_Registry::get('log')
Я сделал почти то же самое, но зашел в db. Здесь мой код, который я разместил в 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');
Надеюсь, что это поможет;)
Как это может быть;
/*
* 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;
}
Просто записав класс ведения журнала, возможно, поделившись тем, что я сделал, вы получите некоторые идеи...
От index.php(от ZF 1.62) Я вызываю статический метод из класса в моей библиотеке, он определяет, являетесь ли вы в dev или выше, а затем дает соответствующий логгер. В dev он будет записываться в Firebug, в стадии + он будет записываться в файл... Я планирую добавить аварийный регистратор, который будет отправлять оповещения по электронной почте о плохих событиях, таких как неудавшийся запрос, который может указывать на попытку ввода в дБ...
Затем в моем базовом контроллере, из которого все контроллеры расширяются, я вызываю регистратор. Таким образом, для всех действий требуется только одна строка, чтобы поговорить с регистратором... например. $Это → _ logger- > отладки ( 'тест');
Сохранение одной строки может показаться не большой проблемой, но когда вы просто выплевываете отладочные сообщения, которые вы планируете удалить через минуту, это действительно раздражает, чтобы запомнить синтаксис и набрать оба...
Кроме того, выплевываясь к firebug, вам не нужно заниматься w/messing up layout или удалять отладочное сообщение сразу, так как оно никогда не будет отображаться в процессе производства.