1

我正在尝试通过 application.ini 文件进行日志记录,但我遇到了一个错误。

resources.log.db.writerName = "Db"
resources.log.db.writerParams.db.adapter = "PDO_SQLITE"
resources.log.db.writerParams.db.dbname = ROOT "/data/tmp.db3"
resources.log.db.writerParams.db.table = "logs"
resources.log.db.writerParams.db.columnMap.priority = "priority"
resources.log.db.writerParams.db.columnMap.message  = "message"

Fatal error: Call to a member function insert() on a non-object in /var/www/libs/zend/library/Zend/Log/Writer/Db.php on line 137
4

3 回答 3

6

我在这里提交了一个修复:http: //framework.zend.com/issues/browse/ZF-9497

于 2010-03-21T17:42:31.437 回答
2

您还不能从 Ini 配置实例化数据库记录器。

要么在你的 Bootstrap_initLog方法中设置 Logger,要么扩展常规 Zend_Log 类以使用默认 DB 适配器,或者更好地实例化 application.ini 中给出的 DB 适配器。

看这里:


如果您对为什么它在 application.ini 中不起作用感兴趣:

Log Resource Plugin 会调用Zend_Log::factoryMethod,Method 反过来会检查你定义的 Writer,然后调用这个 Writer 的factory方法来创建一个新的 Writer 实例。但是Zend_Log_Writer_Db期望它的构造函数的第一个参数是一个Zend_Db_Adapter实例,但它不会强制它。

您不能从 ini 文件中提供实例。当您尝试写入时,编写器将检查是否设置了 _db 属性,并在它为空时抛出异常。但是您为该属性提供了一个字符串,因此 _db 不为 null 并且不会抛出。相反,当尝试编写您的 writer will 时$this->_db->insert(),会导致错误,因为 _db 应该是缺少的Zend_Db_Adapter,但它是一个字符串,例如一个非对象。

有关详细信息,请参见 factory() 和 _write() 方法:

于 2010-03-21T16:51:36.713 回答
0

我用这个引导程序:

protected function _initLog()
{
    $options = $this->getOption('resources');
    $db = Zend_Registry::get('db');
    $options['log']['db']['writerParams']['db'] = $db;

    $logOptions = $options['log'];
    $logger = Zend_Log::factory($logOptions);
    $logger->addPriority('DBLOG', 9);
    Zend_Registry::set('logger', $logger);
}

然后您可以将 application.ini 用于其他设置:

resources.log.db.writerName = "Db"
;resources.log.db.writerParams.adapter = <<this must be a database connection, configured in bootstrap>>
resources.log.db.writerParams.table = "users_logs"
resources.log.db.writerParams.columnMap.id  = "id"
resources.log.db.writerParams.columnMap.created  = "created"
resources.log.db.filterName = "Priority"
resources.log.db.filterParams.priority = 9
resources.log.db.filterParams.operator = "=="
于 2012-12-14T19:13:43.977 回答