Zend框架 - > Zend_Log通过application.ini => insert()对非对象错误

时间:2010-03-20 22:18:08

标签: zend-framework zend-log

我正在尝试通过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

3 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:2)

您无法从Ini配置实例化数据库记录器。

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

见这里:


如果您感兴趣,为什么它无法在application.ini中运行:

Log Resource Plugin将调用Zend_Log::factory方法,该方法将检查您定义的Writer,然后调用此Writer的factory方法来创建新的Writer实例。但Zend_Log_Writer_Db期望它的构造函数的第一个参数是Zend_Db_Adapter实例,但它不会强制执行它。

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

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

答案 2 :(得分: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 = "=="