我正在尝试通过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
答案 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 = "=="