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の指定もすることが出来ない。
(これらはコードを読んで理解できた)