Zend Frameworkでエラー発生時にログが出なくなっていたわけだが、調べてみると何のことはない。
エラー発生時に呼ばれるErrorControllerがデフォルトのままになっていた。。

デフォルトだとエラーが画面に出力されるワケだが、Ajaxリクエスト時に500エラーの場合はレスポンスを破棄していた。
これじゃあエラーはどこにも出ない。
何たるショボさ。

とりあえず、こんな感じにカスタム。

<?php

class ErrorController extends Default_Controller_Abstract
{
    public function errorAction()
    {
        $errors = $this->_getParam('error_handler');

        switch ($errors->type) {
            case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:
            case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:
                // 404 error -- controller or action not found
                $this->getResponse()->setHttpResponseCode(404);
                $this->view->message = 'ページが見つかりませんでした。';
                break;
            default:
                // application error
                $this->getResponse()->setHttpResponseCode(500);
                $this->view->message = 'アプリケーションエラーが発生しました。';

                // 500エラーの場合はログをとる
                $trace = $errors->exception->getTrace();
                $errorMsg = sprintf("%s: %s in %s line %s.\n%s\nParams: %s",
                    $errors->type,
                    $errors->exception->getMessage(),
                    $trace[0]['file'],
                    $trace[0]['line'],
                    $errors->exception->getTraceAsString(),
                    serialize($errors->request->getParams())); // ついでにパラメータもつけちゃお
                // とりあえず標準のエラーログへ出力。アプリが複数乗っているサーバなら分けた方がGOOD
                error_log($errorMsg);
                break;
        }

        $this->view->exception = $errors->exception;
        $this->view->request   = $errors->request;
    }

}

開発時はエラーハンドラは最優先で実装しましょー。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

Name *
Email *
Website

*