print_r を使ってログ出力
Zend_Log を使用して、配列の情報を出力したかった。
例えば、$error には array('hoge' => 'ほげ', 'fuga' => 'ふが'); と入ってるとすると、
<?php require_once 'Zend/Log.php'; require_once 'Zend/Log/Writer/Stream.php'; $writer = new Zend_Log_Writer_Stream('path/to/log'); $logger = new Zend_Log($writer); $logger->log($error, Zend_Log::ERR);
結果
2008-04-03T23:46:12+09:00 ERR (3): Array
となった。
Zend_Log::log(); を見てみると、
log (line 120)
Log a message at a priority
- throws: Zend_Log_Exception
- access: public
void log (string $message, integer $priority)
http://framework.zend.com/apidoc/core/
- string $message: Message to log
- integer $priority: Priority of message
と、思いっきり string となってる。
じゃあ var_export を使ってログに表示してやるか〜と思ったけど、
そういえば、PEAR::Log は配列やオブジェクトを整形してログに表示してたな〜どうやってんだろと思い、ソースを見てみたら、
Log.php の function _extractMessage($message) というメソッドの中で、メッセージを展開していて、その中で、print_r を使ってた。
説明
mixed print_r ( mixed $expression [, bool $return ] )return
print_r() の結果を取得したい場合には return 引数を試用してください。 print_r() はデフォルトでは結果を直接表示してしまいますが この引数が TRUE の場合には結果を戻します。http://jp2.php.net/manual/ja/function.print-r.php
なんと。var_export は知っていたけど、print_r の第二引数は知らんかった。
というわけで、以下のようにしたら、
<?php require_once 'Zend/Log.php'; require_once 'Zend/Log/Writer/Stream.php'; $writer = new Zend_Log_Writer_Stream('path/to/log'); $logger = new Zend_Log($writer); $error = print_r($error, true); $logger->log($error, Zend_Log::ERR);
結果
2008-04-03T23:47:32+09:00 ERR (3): Array ( [hoge] => ほげ [fuga] => ふが )
var_dump に隠れがちであまり使われていない可哀想な print_r だけど、使い道がちゃんとあったw