きっとログのカスタマイズも簡単に出来るんだろうと思って調べ始めたら、以下のことを思われた人向け。
- チャンネルとハンドラーという言葉が出てきて嫌になった。
- config/logging.phpを覗いたら、設定がめんどくさそうでstorage/logs/laravel.logへのそのままの出力でいいかと思った。
- なんとなくどう書けばいけそうな気がするけど本当に正しいのか分からない、またはおかしいことになってないか心配。
まず、Laravelは、monologというphpのログ取得ライブラリが使用されている。
monologの基本を押さえた方が理解が進むと思うので、まずは最低限の単語から。
■チャンネル
ロガーのインスタンスのこと。
■ログレベル
ログの重要度で8段階に定義されている。
重要度(低)
- DEBUG
- INFO
- NOTICE
- WARNING
- ERROR
- CRITICAL
- ALERT
- EMERGENCY
重要度(高)
■ハンドラー
どのログレベル(ログレベル以上)でどういう処理をするか。
- ファイルに出力
- メール送信
- slackで通知
など。
手順
1.チャンネルを作成(ロガーのインスタンスを生成)する。
2.チャンネルに対し、ログレベルを指定しハンドラーを登録する。
※1つのチャンネルに対し複数のハンドラーを登録することも出来る。
3.ログレベルを指定(ログレベルに対応したメソッドを使用)してログを出力する。
コード例
$log = new Logger('name');
$log->pushHandler(new StreamHandler('ログ出力先ファイル名A', Logger::DEBUG));
$log->pushHandler(new StreamHandler('ログ出力先ファイル名B', Logger::NOTICE));
$log->debug('debug message');
$log->warning('warning message');
解説
$log = new Logger(‘name’);
チャンネル名を指定し、ロガーのインスタンスを作成する。
ログが以下のように出力されるので、分かりやすい名前を付けておくとよい。
[ログ出力日時] チャンネル名.ログレベル: ログ内容
$log->pushHandler(new StreamHandler(‘ログ出力先ファイル名A’, Logger::DEBUG));
ログレベルがDEBUG以上のログが出力されたら、ログ出力先ファイル名Aに出力する。
$log->pushHandler(new StreamHandler(‘ログ出力先ファイル名B’, Logger::NOTICE));
ログレベルがNOTICE以上のログが出力されたら、ログ出力先ファイル名Bに出力する。
$log->debug(‘debug message’);
ログレベルがDEBUGのログを出力。
ログ出力先ファイル名Aにログが出力される。
※ログ出力先ファイル名Bは、NOTICE以上のログレベルが対象なので出力されない。
$log->warning(‘warning message’);
ログレベルがWARNINGのログを出力。
ログ出力先ファイル名A、ログ出力先ファイル名Bの両方に出力される。
上手に使えば、環境別、機能別、ログレベルによって処理を分けるということが可能になる。
環境 | チャンネル名 | 出力先 | ログレベル |
開発環境 | dev_func_a | ファイル | DEBUG |
〃 | dev_func_b | ファイル | DEBUG |
ステージング | staging | ファイル | WARNING |
〃 | 〃 | メール | ERROR |
本番 | production | ファイル | WARNING |
〃 | 〃 | slack | ALERT |
これで基礎は大丈夫だと思います。
Laravelのlogging.phpへの記述の仕方は次回書きます。