所以我想开始登录我的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');
答案 0 :(得分:7)
最简单的方法是使用Zend_Registry存储日志
在引导程序中使用
Zend_Registry::set('log', $log);
并使用它来获取该日志
Zend_Registry::get('log')
答案 1 :(得分:5)
我做了差不多但是登录到数据库。这里我的代码放在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 :(得分:2)
喜欢这样;
/*
* 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;
}
答案 3 :(得分:1)
刚刚编写了一个日志记录类,也许通过分享我所做的事情,你会得到一些想法......
来自index.php(在ZF 1.62上)我从我的库中的类调用静态方法,它确定你是在dev还是更高,然后给你一个合适的记录器。在dev中它将登录到Firebug,在阶段+它将记录到文件...我计划添加一个紧急记录器,它将发送错误事件的电子邮件警报,例如失败的查询,这可能表示尝试注入dB ...
然后在我的所有控制器扩展的基础控制器中,我调用记录器。这样,所有操作只需要一行与记录器通信......例如。 $这 - > _logger->调试( '试验');
保存一行可能看起来不是什么大问题,但是当你只是吐出你计划在一分钟后删除的调试消息时,记住语法并输入两者都很烦人...
此外,通过吐痰到firebug,您不必处理混乱布局或立即删除调试消息,因为它永远不会在生产中显示。