12月 262011
 

ログ出力用のアクションヘルパー | Inhale n’ Exhaleどんなアプリケーションを開発するときでも、簡単にログを出力できる仕組みは早いうちに実装しておきたいものだ。Zend Frameworkでログ出力をするときはZend_Logを利用するのが一般的。サンプルコードを見ると、

1$writer = new Zend_Log_Writer_Stream('php://output');
2$logger = new Zend_Log($writer);

と、ライターのインスタンスを生成してロガーのインスタンスを生成するコードを書くのか?と思わされるが、幸いZend_Application_Resource_Logというリソースプラグインが用意されているので、

1resources.log.stream.writerName = "Stream"
2resources.log.stream.writerParams.stream = "php://output"

のような設定ファイルを作れば、ブートストラップからZend_Logのインスタンスを取得できるようになる。`zf create project`コマンドで作られるデフォルトのエラーコントローラには、ブートストラップを利用してログを出力するコードが含まれている。

1class ErrorController extends Zend_Controller_Action
2{
3    public function errorAction()
4    {
5        (略)
6 
7        // Log exception, if logger available
8        if ($log = $this->getLog()) {
9            $log->crit($this->view->message, $errors->exception);
10        }
11 
12        (略)
13    }
14 
15    public function getLog()
16    {
17        $bootstrap = $this->getInvokeArg('bootstrap');
18        if (!$bootstrap->hasResource('Log')) {
19            return false;
20        }
21        $log = $bootstrap->getResource('Log');
22        return $log;
23    }
24}

エラーコントローラでだけでなく、自前のアクションコントローラでも同じようにログ出力を行いたいと思ったときに、上記のような実装をいちいち書かなければならないのは非常に面倒なので、こういう場合はアクションヘルパーを作ってしまうのが一番。

1class My_Action_Helper_Log extends Zend_Controller_Action_Helper_Abstract
2{
3  public function direct()
4  {
5    call_user_func_array(array($this, 'info'), func_get_args());
6  }
7 
8  public function __call($method, $params)
9  {
10    $logger = $this->_getLogger();
11    if($logger)
12    {
13      call_user_func_array(array($logger, $method), $params);
14    }
15  }
16 
17  private function _getLogger()
18  {
19    $bootstrap = $this->getActionController()->getInvokeArg('bootstrap');
20    return $bootstrap->hasResource('Log') ? $bootstrap->getResource('Log') : false;
21  }
22}

マジックメソッド__call()を使うことで、Zend_Logが持っている関数すべてにアクセスできるようにしている。プロキシクラスね。_getLogger()関数は、前述のエラーコントローラーのgetLog()関数の実装をパクった。アクションコントローラなのでdirect()を実装して、ここではとりまZend_Log::INFOでログ出力するようにしたが、アプリケーションの中で最も頻繁に使われるプライオリティを実装しておくといいだろう。

前述のエラーコントローラでのログ出力部分が

1// Log exception, if logger available
2$this->_helper->log->crit($this->view->message, $errors->exception);

と、呼び出せるようになる。

  1 コメント

 返信する

以下のHTML タグと属性が利用できます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(required)

(required)

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください