PHPでデバッグするときは、画面上にvar_dumpで情報を見ていたのですが、これができない場面ではログへの出力を行うことになります。
いままではフレームワークに標準でついてたんですが、これを機に一般のPHPのログ出力について勉強。
既存のPHPのログ出力に関していうと下記リンクが詳しいです。
https://unoh.github.io/2007/05/10/php-logging-to-text-files.html
上記のリンクに上がっている方法が一番歴史があるとおもうのですが、2016年5月現在,PHP monologというライブラリが使えるという情報を聞いたので早速調査つかってみました。
インストール
composerでインストールできます。composer.jsonに下記のように記述してcomopser installでOKです。
1 2 3 4 5 |
{ "require": { "monolog/monolog": "@stable" } } |
プログラム
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
require_once __DIR__ . '/vendor/autoload.php'; use Monolog\Logger; use Monolog\Handler\StreamHandler; use Monolog\Formatter\LineFormatter; //ログファイルのパス $logging_path = __DIR__ . '/log/test_log.log'; $stream = new StreamHandler($logging_path, Logger::INFO); //出力後、改行するために下記クラスを静止し、パラメーターとしてセットします $formatter = new LineFormatter(null, null, true); $stream->setFormatter($formatter); $logger = new Logger('foo_test'); $logger->pushHandler($stream); //下記のようにしないと配列などの値が出力されないです。 $logger->pushProcessor(function ($record) { $record['extra']['dummy'] = ''; return $record; }); //$arrは出力したいデータ $logger->addInfo('request_info ' . dumper($arr)); //var_dumpの結果を文字列として出力するために下記関数を追加 function dumper($obj){ ob_start(); var_dump($obj); $ret = ob_get_contents(); ob_end_clean(); return $ret; } |
一応上記のプログラムでなんとかデバッグができるようになりました。
1 2 3 4 |
$logger->pushProcessor(function ($record) { $record['extra']['dummy'] = ''; return $record; }); |
と書けば、配列でもオブジェクトでも内容を出力することはできるのですが(逆に言うとこれを書かないと出力されないです。)、ここに直に配列やオブジェクトを渡しても改行されていないため、非常に見にくいです。
そこでvar_dumpの結果自体を文字列として引き渡せばいいということに気づき、
1 2 3 4 5 6 7 |
function dumper($obj){ ob_start(); var_dump($obj); $ret = ob_get_contents(); ob_end_clean(); return $ret; } |
というメソッドを実装しています。
参考リンク