• []
  • []
  •  
  • del.icio.us 
  •  
  • Yahoo!֥åޡϿ 

PRADO エラー処理およびログ出力

PHP 求人 募集 Symfony CakePHP Smarty Ruby on Rails

PRADO ロギング 概要

ログ排出機構が全く付いていないシステムは、
問題発生時の対応が難しくなる。
なので、ロギングは必須。

PRADOには標準でログ出力機構が実装されている。

PRADO ロギング 詳細

PRADO ロギング 設定

ログの設定をする。
modulesタグ内に記述。
/protected/application.xml

    <module id="log" class="System.Util.TLogRouter">
      <route class="TFileLogRoute" Categories="System,Application"
        LogFile="prado_app.log" />
    </module>

LogPath設定は何故かうまくいかない。

PRADO ロギング 出力

使用法はプログラム上に以下の記述をする。

Prado::log('エラーメッセージ',TLogger::ERROR,'Application.pages.Home');

PRADO エラー処理概要

システムエラーが発生した時に、
エラー画面が表示されるわけだが、
それらを一つ一つ組んでいてはフレームワークの意味がない。
PRADOの標準のエラー処理をアプリケーション上でも利用することが出来る。

また、エラー画面がデフォルトのものではなく、
カスタマイズされたエラー画面を利用するのが普通だろう。
併せてカスタマイズエラー画面も利用することにする。

PRADO エラー処理およびログ出力 詳細

PRADO エラー画面

まずはエラー画面。
本来なら通常のCSSに合わせたモノにすると思うが、
ここではエラーメッセージが表示されるだけのモノにする。
/protected/Error.html

<html>
<head>
<meta http-equiv="Content-Type"
   content="text/html;charset=UTF-8" />
<title>%%ErrorMessage%%</title>
</head>
<body>
<h1>エラーが発生しました。</h1>
%%StatusCode%%:%%ErrorMessage%%
</body>
</html>

エラー処理はどうしても通常の処理系と分ける必要があるため、
テンプレートシステムは利用できない。
アプリケーションエラーだけでも通常と同じで良いと思うが、
そのうちなんとかするとしよう。

PRADO エラーハンドラ

エラーを処理するハンドラはデフォルトのモノではテンプレートを変えられないので、
ハンドラを別のモノに変更する。
TErrorHandlerを継承したコードを下記、
application.xmlで指定する。
/protected/pages/ErrorHandler.php

<?php
 
Prado::using('System.Exceptions.TErrorHandler');
 
class ErrorHandler extends TErrorHandler
{
 /**
  * Retrieves the template used for displaying external exceptions.
  * This method overrides the parent implementation.
  */
 protected function getErrorTemplate($statusCode,$exception)
 {
  // use our own template for BlogException
  if($exception instanceof THttpException)
  {
   // get the path of the error template file: protected/error.html
   $templateFile=Prado::getPathOfNamespace('Application.Error', '.html');
   return file_get_contents($templateFile);
  }
  else // otherwise use the template defined by PRADO
   return parent::getErrorTemplate($statusCode,$exception);
 }
 
 /**
  * Handles external error caused by end-users.
  * This method overrides the parent implementation.
  * It is invoked by PRADO when an external exception is thrown.
  */
 protected function handleExternalError($statusCode,$exception)
 {
  // log the error (only for TErrorHandler)
  if($exception instanceof TErrorHandler){
   Prado::log($exception->getErrorMessage(),TLogger::ERROR,'application');
            Prado::trace('backtrace','application');
        }
  // call parent implementation to display the error
  parent::handleExternalError($statusCode,$exception);
 }
}

/protected/application.xml

    <module class="Application.pages.ErrorHandler" />

エラー画面とエラーハンドラを同じディレクトリに置くと、
何故かエラーはハンドラのプログラムが画面に表示される。


framework/prado/logging.txt · 最終更新: 2008/02/09 20:09 by dozo