Zend Log の出力先をデータベースにする
Zend_Log_Writer_Dbを利用する上で、ハマったところをメモ。
Bootstrap.php の _initLog() へベタで記述するのが一番ラクだった。
が、開発環境と本番環境で、ログの出力先を変える必要があったので、application.ini との併用が出来ないか試行錯誤してみた。
Bootstrap.php のみでの設定
Bootstrap.php
$db = Zend_Registry::get('database'); $columnMapping = array( 'priority' => 'priority', 'message' => 'message', 'info' => 'info', 'timestamp' => 'timestamp',); $writer = new Zend_Log_Writer_Db($db, 'sp_zend_log', $columnMapping); $writer->addFilter(new Zend_Log_Filter_Priority(Zend_Log::DEBUG)); $log = new Zend_Log($writer); Zend_Registry::set('log', $log)
application.ini との併用
Bootstrap.php
$resource = $this->getPluginResource('log'); $opts = $resource->mergeOptions($resource->getOptions(), array( 'db' => array( 'writerParams' => array( 'db' => Zend_Registry::get('database'), )), )); $resource->setOptions($opts); $log = $resource->getLog(); Zend_Registry::set('log', $log); return $log;
application.ini
resources.log.db.writerName = "Db" #resources.log.db.writerParams.adapter = "database" resources.log.db.writerParams.dbname = "dbname" resources.log.db.writerParams.table = "zend_log" resources.log.db.writerParams.columnMap.priority = "priority" resources.log.db.writerParams.columnMap.message = "message" resources.log.db.writerParams.columnMap.info = "info" resources.log.db.writerParams.columnMap.timestamp = "timestamp"
Bootstrap.php で adapter の設定を行っているのは、 application.ini ではどうしても指定が出来ないから。
また、formatterの指定もすることが出来ない。
(これらはコードを読んで理解できた)