2015年の現在であってもPHPでのWebアプリケーション開発は、なんだかんだといってブラウザでの目視確認に頼りがちだ。
なので、ロガーに流した内容は開発環境ではブラウザでそのまま見えた方がべんり… なこともあるんじゃないかなあ、たぶん。
そんなわけで、Logger Guardなるものを作った。
PSR-3についてご存じない方は PSR-3 Logger Interfaceの話 - 泥のように を読んでほしい。
インストール
Composerをインストールしてるプロジェクトなら、コマンドラインで composer require 'zonuexe/logger-guard'
って実行するだけですよ。
設定
このライブラリは、あくまでデバッグ用(当たり前だ)なので、開発環境以外でnew Teto\Logger\Guard
されることがないように注意して欲しい。
<?php
$logger = new \Monolog\Logger('myapp');
$logger->pushHandler(new \Monolog\Handler\ErrorLogHandler);
// 開発環境では define('DEBUG', true) してある想定
if (defined('DEBUG') && DEBUG) {
$guard = new Teto\Logger\Guard($logger, 'notice');
}
// ↓ あとはふつうに実装するだけ
$logger->debug('printデバッグ');
$logger->info('ログイン情報とか');
$logger->error('エラーっぽい感じ');
$logger->warning('怪しげな感じ');
$logger->notice('大事なことなのでry');
$logger->crit('致命的なエラーとか');
$logger->alert('たすけてえーりん');
$logger->emerg('もうだめぽ');
// 後処理は特に書く必要はなくて、勝手に出力される
あと、Monologはかなり柔軟で扱ひやすい構造になってるので、知らなかったひとは使ってみてほしい。
出力
headers_list()から勝手にレスポンスのContent-typeを取得してきてログのフォーマッターを選ぶので、別に何もしなくていい。
Content-type: text/plain
みたいなときは、ちゃんとHTMLが吐かれないようにはしてる。
Guardって何
オブジェクトのデストラクタで副作用を起こすことを目的にした実装パターンのことを guard object とか scope guard とか呼ぶらしいので、それにあやかった。
C++もPerlもよくわかんないんだけど。
デストラクタから例外が投げられると致命的エラーになるので使ひどころを見極めるのが難しい処理ではあるのだけれど、今回のようにデバッグ用途でならアリかな、と言った感じだ。
あとがき
PHPにもマクロ欲しいなと思った。
追記
PHP - ログをデバッグ時にブラウザに出力する by @tadsan on @Qiita http://t.co/sao1LbD0yC そういやChromeLoggerなんていう便利な拡張があってだな......最近使ってないけどあっちはどうなった
— 保 登 心 愛 (@hnle0) March 8, 2015
良い質問ですね!
これを利用するには、お手元のGoogle ChromeにChrome Logger - Chrome ウェブストアをインストールして、コードに一行追加するだけで良い。
<?php
$logger = new \Monolog\Logger('myapp');
$logger->pushHandler(new \Monolog\Handler\ErrorLogHandler);
// 開発環境では define('DEBUG', true) してある想定
if (defined('DEBUG') && DEBUG) {
// ↓ この行を追加するだけ
$logger->pushHandler(new \Monolog\Handler\ChromePHPHandler('NOTICE'));
// ↑ ここまで
$guard = new Teto\Logger\Guard($logger, 'notice');
}
Guardは全然関係なかった! この場合も、開発環境の外でお漏らししないように気をつけてくださいね。
FirePHPってのもあるらしく、Monologも対応してるので、興味があったら調べてみてください。