13

所以我想开始登录我的 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

4 回答 4

7

最简单的就是使用 Zend_Registry 来存储日志

在你的引导程序中使用它

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

并使用它来获取该日志

Zend_Registry::get('log')
于 2009-11-15T23:45:27.237 回答
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');

希望这有助于;)

于 2011-07-20T20:47:38.687 回答
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;
}
于 2009-12-12T23:44:14.030 回答
1

刚刚写了一个日志类,也许通过分享我所做的你会得到一些想法......

从 index.php (在 ZF 1.62 上)我从我的库中的一个类中调用一个静态方法,它确定你是在 dev 还是更高版本,然后给你一个合适的记录器。在 dev 中,它将记录到 Firebug,在 stage+ 中,它将记录到文件...我计划添加一个紧急记录器,该记录器将发送有关不良事件的电子邮件警报,例如失败的查询,这可能表明尝试注入 dB...

然后在所有控制器扩展的基本控制器中,我调用记录器。这样,所有操作只需要一行来与记录器对话...例如 $this->_logger->debug('test');

保存一行可能看起来没什么大不了的,但是当您只是吐出计划在一分钟后删除的调试消息时,记住语法并键入两者真的很烦人...

此外,通过向萤火虫吐出,您不必处理混乱的布局,也不必立即删除调试消息,因为它永远不会在生产中显示。

于 2009-11-17T05:26:41.203 回答