Zend Framework の紹介

 Learning Zend Framework

appendix

 Zend Framework リファレンス


  • 第36章 Zend_Gdata
  • 第37章 Zend_Http
  • 第38章 Zend_InfoCard
  • 第39章 Zend_Json
  • 第40章 Zend_Layout
  • 第41章 Zend_Ldap
  • 第42章 Zend_Loader
  • 第43章 Zend_Locale
  • 第44章 Zend_Log
  • 第45章 Zend_Mail
  • 第46章 Zend_Markup
  • 第47章 Zend_Measure
  • 第48章 Zend_Memory
  • 第49章 Zend_Mime
  • 第50章 Zend_Navigation
  • 第51章 Zend_Oauth
  • 第52章 Zend_OpenId
  • 第53章 Zend_Paginator
  • 第54章 Zend_Pdf
  • 第55章 Zend_ProgressBar
  • 第56章 Zend_Queue
  • 第57章 Zend_Reflection
  • 第58章 Zend_Registry
  • 第59章 Zend_Rest

  • 第60章 Zend_Search_Lucene
  • 第61章 Zend_Serializer
  • 第62章 Zend_Server
  • 第63章 Zend_Service
  • 第64章 Zend_Session
  • 第65章 Zend_Soap
  • 第66章 Zend_Tag
  • 第67章 Zend_Test
  • 第68章 Zend_Text
  • 第69章 Zend_TimeSync
  • 第70章 Zend_Tool
  • 第71章 Zend_Tool_Framework
  • 第72章 Zend_Tool_Project
  • 第73章 Zend_Translate
  • 第74章 Zend_Uri
  • 第75章 Zend_Validate
  • 第76章 Zend_Version
  • 第77章 Zend_View
  • 第78章 Zend_Wildfire
  • 第79章 Zend_XmlRpc
  • ZendX_Console_Process_Unix
  • ZendX_JQuery
  • Translation 70.6% Update 2010-11-28 - Revision 23415

    44.2. Writers

    A Writer is an object that inherits from Zend_Log_Writer_Abstract. A Writer's responsibility is to record log data to a storage backend.

    44.2.1. Writing to Streams

    Zend_Log_Writer_Stream sends log data to a PHP stream.

    To write log data to the PHP output buffer, use the URL php://output. Alternatively, you can send log data directly to a stream like STDERR (php://stderr).

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

    $logger->info('Informational message');

    To write data to a file, use one of the Filesystem URLs:

    $writer = new Zend_Log_Writer_Stream('/path/to/logfile');
    $logger = new Zend_Log($writer);

    $logger->info('Informational message');

    By default, the stream opens in the append mode ("a"). To open it with a different mode, the Zend_Log_Writer_Stream constructor accepts an optional second parameter for the mode.

    The constructor of Zend_Log_Writer_Stream also accepts an existing stream resource:

    $stream = @fopen('/path/to/logfile''a'false);
    if (! 
    $stream) {
        throw new 
    Exception('Failed to open stream');
    }

    $writer = new Zend_Log_Writer_Stream($stream);
    $logger = new Zend_Log($writer);

    $logger->info('Informational message');

    You cannot specify the mode for existing stream resources. Doing so causes a Zend_Log_Exception to be thrown.

    44.2.2. Writing to Databases

    Zend_Log_Writer_Db writes log information to a database table using Zend_Db. The constructor of Zend_Log_Writer_Db receives a Zend_Db_Adapter instance, a table name, and a mapping of database columns to event data items:

    $params = array ('host'     => '127.0.0.1',
                     
    'username' => 'malory',
                     
    'password' => '******',
                     
    'dbname'   => 'camelot');
    $db Zend_Db::factory('PDO_MYSQL'$params);

    $columnMapping = array('lvl' => 'priority''msg' => 'message');
    $writer = new Zend_Log_Writer_Db($db'log_table_name'$columnMapping);

    $logger = new Zend_Log($writer);

    $logger->info('Informational message');

    The example above writes a single row of log data to the database table named 'log_table_name' table. The database column named 'lvl' receives the priority number and the column named 'msg' receives the log message.

    44.2.3. Firebug への書き込み

    Zend_Log_Writer_Firebug は、ログデータを Firebug コンソール に送信します。

    すべてのデータの送信には Zend_Wildfire_Channel_HttpHeaders コンポーネントを使用します。これは HTTP ヘッダを使用するので、 ページのコンテンツには何も影響を及ぼしません。 この方式なら、AJAX リクエストのようにクリーンな JSON および XML レスポンスを要求するリクエストのデバッグも行えます。

    要件:

    例 44.1. Zend_Controller_Front を使ったログ記録

    // 起動ファイルで、フロントコントローラのディスパッチの前に記述します
    $writer = new Zend_Log_Writer_Firebug();
    $logger = new Zend_Log($writer);

    // モデル、ビューおよびコントローラのファイル内でこれを使用します
    $logger->log('This is a log message!'Zend_Log::INFO);

    例 44.2. Zend_Controller_Front を使わないログ記録

    $writer = new Zend_Log_Writer_Firebug();
    $logger = new Zend_Log($writer);

    $request = new Zend_Controller_Request_Http();
    $response = new Zend_Controller_Response_Http();
    $channel Zend_Wildfire_Channel_HttpHeaders::getInstance();
    $channel->setRequest($request);
    $channel->setResponse($response);

    // 出力バッファリングを開始します
    ob_start();

    // ロガーをコールします

    $logger->log('This is a log message!'Zend_Log::INFO);

    // ログデータをブラウザに送ります
    $channel->flush();
    $response->sendHeaders();

    44.2.3.1. 優先度のスタイルの設定

    組み込みの優先度やユーザ定義の優先度を使うには setPriorityStyle() メソッドを使用します。

    $logger->addPriority('FOO'8);
    $writer->setPriorityStyle(8'TRACE');
    $logger->foo('Foo Message');

    ユーザ定義の優先度用のデフォルトのスタイルを設定するには setDefaultPriorityStyle() メソッドを使用します。

    $writer->setDefaultPriorityStyle('TRACE');

    サポートしているスタイルは次のとおりです。

    表 44.2. Firebug Logging Styles

    スタイル 説明
    LOG 通常のログメッセージを表示します
    INFO 情報ログメッセージを表示します
    WARN 警告ログメッセージを表示します
    ERROR エラーログメッセージを表示し、Firebug のエラーカウントをひとつ増やします
    TRACE 拡張スタックトレースつきのログメッセージを表示します
    EXCEPTION 拡張スタックトレースつきのエラーログメッセージを表示します
    TABLE 拡張テーブルつきのログメッセージを表示します


    44.2.3.2. ログ記録用のデータの準備

    任意の PHP の変数を組み込みの優先度でログに記録できますが、 特殊なログ形式を使う場合は、何らかの書式変換が必要となります。

    LOGINFOWARNERROR そして TRACE については特別な書式変換は不要です。

    44.2.3.3. 例外のログ記録

    Zend_Exception のログを記録するには、 単にその例外オブジェクトをロガーに渡すだけです。 設定している優先度やスタイルにかかわらず、 例外は自動的に例外と判断されます。

    $exception = new Zend_Exception('Test exception');
    $logger->err($exception);

    44.2.3.4. 表形式のログ

    ログを表形式で記録できます。カラムは自動検出され、 データの最初の行がヘッダと見なされます。

    $writer->setPriorityStyle(8'TABLE');
    $logger->addPriority('TABLE'8);

    $table = array('Summary line for the table',
                 array(
                     array(
    'Column 1''Column 2'),
                     array(
    'Row 1 c 1',' Row 1 c 2'),
                     array(
    'Row 2 c 1',' Row 2 c 2')
                 )
                );
    $logger->table($table);

    44.2.4. Email への書き込み

    Zend_Log_Writer_Mail は、 Zend_Mail を使ってログエントリをメールのメッセージに書き出します。 Zend_Log_Writer_Mail のコンストラクタは Zend_Mail オブジェクトを受け取り、 またオプションで Zend_Layout オブジェクトを受け取ります。

    Zend_Log_Writer_Mail の主な使い道は、 開発者やシステム管理者など関係者に対して PHP スクリプトで発生したエラーを通知することです。 「何か問題がおこったら、すぐに人間に通知しないとね。 そうすればすぐに適切な対応ができるわけだから」そんなアイデアを元に Zend_Log_Writer_Mail が誕生しました。

    基本的な使い方は以下のとおりです。

    $mail = new Zend_Mail();
    $mail->setFrom('errors@example.org')
         ->
    addTo('project_developers@example.org');

    $writer = new Zend_Log_Writer_Mail($mail);

    // 件名に使用するテキストを設定します。実際にメッセージを送信する前に、
    // 発生したエラー数がこの件名に付け加えられます
    $writer->setSubjectPrependText('Errors with script foo.php');

    // 警告レベル以上の場合にのみメールを送信します
    $writer->addFilter(Zend_Log::WARN);

    $log = new Zend_Log();
    $log->addWriter($writer);

    // なにかが起こりました!
    $log->error('unable to connect to database');

    // ライターの処理が終了すると Zend_Mail::send() が立ち上がり、
    // 上の Zend_Log フィルタレベル以上のすべてのログメッセージが送信されます

    Zend_Log_Writer_Mail は、デフォルトで メールの本文をプレーンテキスト形式でレンダリングします。

    指定したフィルタレベル以上のすべてのログエントリが、 ひとつのメールにまとめて送られます。たとえば、 警告レベル以上を送信するよう設定しているときに 2 つの警告と 5 つのエラーが発生したら、 メールには 7 つのログエントリが含まれることになります。

    44.2.4.1. Zend_Layout の使用法

    Zend_Layout のインスタンスを使用して、 マルチパートメールの HTML 部を作成できます。 Zend_Layout のインスタンスが用いられた場合、 Zend_Log_Writer_MailHTML をレンダリングするものとみなし、 Zend_Layout がレンダリングした値をメッセージの本文 HTML として設定します。

    Zend_Log_Writer_MailZend_Layout のインスタンスを使う場合には、 setLayoutFormatter() メソッドで独自のフォーマッタを指定できます。 Zend_Layout 用のエントリフォーマッタを指定しなかった場合は、 現在使用中のものをそのまま使います。 Zend_Layout で独自のフォーマッタを使用する方法を以下に示します。

    $mail = new Zend_Mail();
    $mail->setFrom('errors@example.org')
         ->
    addTo('project_developers@example.org');
    // 件名は Zend_Mail のインスタンスには設定していないことに注意しましょう!

    // シンプルに、デフォルトの Zend_Layout のインスタンスを使用します
    $layout = new Zend_Layout();

    // エントリを li タグで囲むフォーマッタを作成します
    $layoutFormatter = new Zend_Log_Formatter_Simple(
        
    '<li>' Zend_Log_Formatter_Simple::DEFAULT_FORMAT '</li>'
    );

    $writer = new Zend_Log_Writer_Mail($mail$layout);

    // Zend_Layout でレンダリングするための、エントリのフォーマッタを適用します
    $writer->setLayoutFormatter($layoutFormatter);
    $writer->setSubjectPrependText('Errors with script foo.php');
    $writer->addFilter(Zend_Log::WARN);

    $log = new Zend_Log();
    $log->addWriter($writer);

    // なにかが起こりました!
    $log->error('unable to connect to database');

    // ライターの処理が終了すると Zend_Mail::send() が立ち上がり、
    // 上の Zend_Log フィルタレベル以上のすべてのログメッセージが送信されます
    // メールは、プレーンテキストと HTML パートの両方を含む形式になります

    44.2.4.2. 件名でのエラーの概要

    setSubjectPrependText() メソッドを Zend_Mail::setSubject() のかわりに使用すると、 メールを送信する直前に件名を動的に書き込むことができます。たとえば、 件名のテキストが "Errors from script" だとすると、 2 つの警告と 5 つのエラーが発生した場合に Zend_Log_Writer_Mail が作成するメールの件名は "Errors from script (warn = 2; error = 5)" となります。Zend_Log_Writer_Mail で件名のテキストを設定しなかった場合、もし Zend_Mail で設定されていればそれを使用します。

    44.2.4.3. 警告

    ログエントリをメールでおくるのは危険なこともあります。 スクリプト内でのエラー条件の処理が不適切だったり エラーレベルの使用法を間違えたりすると、 エラーの発生頻度によっては何百通何千通ものメールを送信してしまう可能性があります。

    現時点では、Zend_Log_Writer_Mail にはメッセージを抑制したりひとつにまとめたりする機能はありません。 そのような機能が必要な場合は自前で実装する必要があります。

    もう一度言いますが、Zend_Log_Writer_Mail の第一の目標は、人間に向けてエラーの情報を積極的に伝えることです。 これらのエラーがタイミングよく処理され、 このような状況が避けられるような機能が実装されたときには、 メールによるエラー通知は便利な道具となることでしょう。

    44.2.5. システムログへの書き込み

    Zend_Log_Writer_Syslogは、 システムログ (syslog) にログ項目を書きます。 内部的には、それはPHPopenlog()closelog()、 そしてsyslog()関数の代わりです。

    Zend_Log_Writer_Syslogが役立つ例の1つは、 クラスター形成されたマシンからシステムログ機能を通して集計されるログです。 多くのシステムでは、システム・イベントをリモートでログ収集できます。 それにより、システム管理者が単一のログファイルでマシンのクラスタをモニターできるようになります。

    デフォルトで、生成されるsyslogメッセージはすべて、 文字列「Zend_Log」という接頭辞が付きます。 コンストラクタ、またはアプリケーション・アクセッサにアプリケーション名を渡すことで、 そのようなログメッセージを特定する異なる「アプリケーション」名を指定するかもしれません。

    //インスタンス生成時に任意で "application" キーを渡します。
    $writer = new Zend_Log_Writer_Syslog(array('application' => 'FooBar'));

    //そのほかいつでも
    $writer->setApplicationName('BarBaz');

    システムログでは "facility" やアプリケーション・タイプ、 またはログ収集メッセージを指定できます。 多くのシステム・ロガーは、実は機能毎に異なるログファイルを生成します。 それは、前と同じように、サーバ活動をモニターする管理者を助けます。

    コンストラクタ、またはアクセッサでログ機能を指定するかもしれません。 それは、openlog() マニュアルで定義される openlog()定数のうちの1つでなければなりません。

    //インスタンス生成時に任意で "facility" キーを渡します。
    $writer = new Zend_Log_Writer_Syslog(array('facility' => LOG_AUTH));

    //そのほかいつでも
    $writer->setFacility(LOG_USER);

    ログ収集時に、デフォルトのZend_Log 優先度定数を使い続けるかもしれません。 内部的には、それらは適切なsyslog() 優先度定数にマップされます。

    44.2.6. Writing to the Zend Server Monitor

    Zend_Log_Writer_ZendMonitor allows you to log events via Zend Server's Monitor API. This allows you to aggregate log messages for your entire application environment in a single location. Internally, it simply uses the monitor_custom_event() function from the Zend Monitor API.

    One particularly useful feature of the Monitor API is that it allows you to specify arbitrary custom information alongside the log message. For instance, if you wish to log an exception, you can log not just the exception message, but pass the entire exception object to the function, and then inspect the object within the Zend Server event monitor.

    [注意] Zend Monitor must be installed and enabled

    In order to use this log writer, Zend Monitor must be both installed and enabled. However, it is designed such that if Zend Monitor is not detected, it will simply act as a NULL logger.

    Instantiating the ZendMonitor log writer is trivial:

    $writer = new Zend_Log_Writer_ZendMonitor();
    $log    = new Zend_Log($writer);

    Then, simply log messages as usual:

    $log->info('This is a message');

    If you want to specify additional information to log with the event, pass that information in a second parameter:

    $log->info('Exception occurred'$e);

    The second parameter may be a scalar, object, or array; if you need to pass multiple pieces of information, the best way to do so is to pass an associative array.

    $log->info('Exception occurred', array(
        
    'request'   => $request,
        
    'exception' => $e,
    ));

    Within Zend Server, your event is logged as a "custom event". From the "Monitor" tab, select the "Events" sub-item, and then filter on "Custom" to see custom events.

    Events in Zend Server's Monitor dashboard

    In this screenshot, the first two events listed are custom events logged via the ZendMonitor log writer. You may then click on an event to view all information related to it.

    Event detail in Zend Server's Monitor

    Clicking on the "Custom" sub tab will detail any extra information you logged by passing the second argument to the logging method. This information will be logged as the info subkey; you can see that the request object was logged in this example.

    [注意] Integration with Zend_Application

    By default, the zf.sh and zf.bat commands add configuration for the Zend_Application log resource, which includes configuration for the ZendMonitor log writer. Additionally, the ErrorController uses the configured logger to log application exceptions -- providing you with Zend Monitor event integration by default.

    As noted previously, if the Monitor API is not detected in your PHP installation, the logger will simply act as a NULL logger.

    44.2.7. Stubbing Out the Writer

    The Zend_Log_Writer_Null is a stub that does not write log data to anything. It is useful for disabling logging or stubbing out logging during tests:

    $writer = new Zend_Log_Writer_Null;
    $logger = new Zend_Log($writer);

    // goes nowhere
    $logger->info('Informational message');

    44.2.8. Testing with the Mock

    The Zend_Log_Writer_Mock is a very simple writer that records the raw data it receives in an array exposed as a public property.

    $mock = new Zend_Log_Writer_Mock;
    $logger = new Zend_Log($mock);

    $logger->info('Informational message');

    var_dump($mock->events[0]);

    // Array
    // (
    //    [timestamp] => 2007-04-06T07:16:37-07:00
    //    [message] => Informational message
    //    [priority] => 6
    //    [priorityName] => INFO
    // )

    To clear the events logged by the mock, simply set $mock->events = array().

    44.2.9. Compositing Writers

    There is no composite Writer object. However, a Log instance can write to any number of Writers. To do this, use the addWriter() method:

    $writer1 = new Zend_Log_Writer_Stream('/path/to/first/logfile');
    $writer2 = new Zend_Log_Writer_Stream('/path/to/second/logfile');

    $logger = new Zend_Log();
    $logger->addWriter($writer1);
    $logger->addWriter($writer2);

    // goes to both writers
    $logger->info('Informational message');
    digg delicious meneame google twitter technorati facebook

    Comments

    Loading...