30.2. ライター

ライターは、Zend_Log_Writer_Abstract を継承したオブジェクトです。ライターの役割は、 ログのデータをバックエンドのストレージに記録することです。

30.2.1. ストリームへの書き出し

Zend_Log_Writer_Stream は、ログデータを PHP のストリーム に書き出します。

ログのデータを PHP の出力バッファに書き出すには、URL php://output を使用します。一方、ログのデータを直接 STDERR のようなストリームに送ることもできます (php://stderr)。

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

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

      

データをファイルに書き出すには、 ファイルシステム URL のいずれかを使用します。

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

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

      

デフォルトでは、ストリームを追記モード ("a") でオープンします。 別のモードでオープンするには、Zend_Log_Writer_Stream のコンストラクタで二番目のオプション引数にモードを指定します。

Zend_Log_Writer_Stream のコンストラクタには、 既存のストリームリソースを指定することもできます。

$stream = @fopen('/path/to/logfile', 'a', false);
if (! $stream) {
    throw new Exception('ストリームのオープンに失敗しました');
}

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

$logger->info('通知メッセージ');

      

既存のストリームリソースに対してモードを指定することはできません。 指定しようとすると Zend_Log_Exception をスローします。

30.2.2. データベースへの書き出し

Zend_Log_Writer_Db は、 Zend_Db を使用してログ情報をデータベースに書き出します。 Zend_Log_Writer_Db のコンストラクタには Zend_Db_Adapter のインスタンス、テーブル名 およびデータベースのカラムとイベントデータ項目との対応を指定します。 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('通知メッセージ');

      

上の例は、一行ぶんのログデータを log_table_name という名前のテーブルに書き出します。データベースのカラム lvl には優先度の番号が格納され、msg というカラムにログのメッセージが格納されます。

30.2.3. Firebug への書き込み

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

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

要件:

例 30.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);

      

例 30.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();

      

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

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

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

      

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

$writer->setDefaultPriorityStyle('TRACE');

      

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

表 30.1. Firebug Logging Styles

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


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

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

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

30.2.3.3. 例外のログ記録

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

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

      

30.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);

      

30.2.4. ライターのスタブ

Zend_Log_Writer_Null はスタブで、ログデータをどこにも書き出しません。 これは、ログ出力を無効にしたりテスト時などに便利です。

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

// どこにも出力されません
$logger->info('通知メッセージ');

      

30.2.5. モックによるテスト

Zend_Log_Writer_Mock は非常にシンプルなライターです。 受け取った生のデータを配列に格納し、それを public プロパティとして公開します。

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

$logger->info('通知メッセージ');

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

// Array
// (
//    [timestamp] => 2007-04-06T07:16:37-07:00
//    [message] => 通知メッセージ
//    [priority] => 6
//    [priorityName] => INFO
// )

      

モックが記録したイベントを消去するには、単純に $mock->events = array() とします。

30.2.6. ライターを組み合わせる

合成ライターオブジェクトはありません。 しかし、ログのインスタンスは任意の数のライターに書き出すことができます。そのためには addWriter() メソッドを使用します。

$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);

// 両方のライターに書き出されます
$logger->info('通知メッセージ');