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構成からデータベースロガーをインスタンス化することはまだできません。

メソッド内のブートストラップでロガーをセットアップするか_initLog、通常のZend_Logクラスを拡張して、デフォルトのDBアダプターを使用するか、application.iniで指定されたDBアダプターをインスタンス化します。

ここを参照してください:


そして、なぜそれがapplication.iniから機能しないのか興味がある場合は、次のようにします。

Log Resource Pluginはメソッドを呼び出し、Zend_Log::factoryメソッドは定義したライターをチェックしてから、このライターのfactoryメソッドを呼び出して新しいライターインスタンスを作成します。ただしZend_Log_Writer_Db、コンストラクターへの最初の引数がZend_Db_Adapterインスタンスであると想定していますが、それを強制することはありません。

iniファイルからインスタンスを提供することはできません。ライターは、nullの場合に例外を書き込んでスローしようとしたときに、_dbプロパティが設定されているかどうかを確認します。ただし、プロパティに文字列を指定したため、_dbはnullではなく、スローされません。代わりに、ライターを書き込もうとすると$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 に答える