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)

  • string $message: Message to log
  • integer $priority: Priority of message
http://framework.zend.com/apidoc/core/

と、思いっきり 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