ライターは、Zend_Log_Writer_Abstract
を継承したオブジェクトです。ライターの役割は、
ログのデータをバックエンドのストレージに記録することです。
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 をスローします。
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
というカラムにログのメッセージが格納されます。
Zend_Log_Writer_Firebug は、ログデータを
Firebug
コンソール
に送信します。
すべてのデータの送信には Zend_Wildfire_Channel_HttpHeaders
コンポーネントを使用します。これは HTTP ヘッダを使用するので、
ページのコンテンツには何も影響を及ぼしません。
この方式なら、AJAX リクエストのようにクリーンな JSON
および XML レスポンスを要求するリクエストのデバッグも行えます。
要件:
Firefox ブラウザ。バージョン 3 が最適ですがバージョン 2 にも対応しています。
Firebug 拡張。 https://addons.mozilla.org/en-US/firefox/addon/1843 からダウンロードできます。
FirePHP 拡張。 https://addons.mozilla.org/en-US/firefox/addon/6149 からダウンロードできます。
例 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();
組み込みの優先度やユーザ定義の優先度を使うには
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 |
拡張テーブルつきのログメッセージを表示します |
任意の PHP の変数を組み込みの優先度でログに記録することができますが、 特殊なログ形式を使う場合は、何らかの書式変換が必要となります。
LOG、INFO、WARN、ERROR
そして TRACE については特別な書式変換は不要です。
Zend_Exception のログを記録するには、
単にその例外オブジェクトをロガーに渡すだけです。
設定している優先度やスタイルにかかわらず、
例外は自動的に例外と判断されます。
$exception = new Zend_Exception('Test exception');
$logger->err($exception);
ログを表形式で記録することができます。カラムは自動検出され、 データの最初の行がヘッダと見なされます。
$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);
Zend_Log_Writer_Null はスタブで、ログデータをどこにも書き出しません。
これは、ログ出力を無効にしたりテスト時などに便利です。
$writer = new Zend_Log_Writer_Null;
$logger = new Zend_Log($writer);
// どこにも出力されません
$logger->info('通知メッセージ');
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()
とします。
合成ライターオブジェクトはありません。
しかし、ログのインスタンスは任意の数のライターに書き出すことができます。そのためには
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('通知メッセージ');