はじめに
Laravelに移行する作業をしていた際に、「Logのレベルにはどのような違いがあるのか?errorやalertはどんな場面で使うべきなのか?」や「Log::warning()
を使用した場合、どのファイルにメッセージが出力されるのか?」といった疑問が出てきたので、調べた内容をまとめてみました。
LaravelのLog levelとレベル感
Laravelのドキュメントによると、Log levelはRFC5424に基づいているようです。そのページから抜粋するとこのようになっていました。
Severity
Code
0 Emergency: system is unusable
1 Alert: action must be taken immediately
2 Critical: critical conditions
3 Error: error conditions
4 Warning: warning conditions
5 Notice: normal but significant condition
6 Informational: informational messages
7 Debug: debug-level messages
では実際にどんな時にどのレベルでログを出せばいいのか?を調べてみると、こんな感じに分けられます。
Level | 意味 | 例 |
---|---|---|
Emergency | システムが使用不可能 | サーバがダウンした、致命的なエラーが発生した |
Alert | すぐに対処が必要 | DB接続が失敗した、重要なサービスが失敗した |
Critical | 重大なエラーが発生した | アプリケーションの重要な機能が動作していない |
Error | エラーが発生した | APIレスポンスエラー |
Warning | 警告メッセージ | ディスク容量が少なくなっている |
Notice | 通常の動作&通知するイベント | ユーザが新しいアカウントを作成した、メールが送信された |
Informational | 動作の情報 | アプリケーションの状態やプロセスの進行状況 |
Debug | デバッグ | 変数の値や関数の戻り値 |
メッセージの出力先
次にどのファイルにログが出力されるように設定しているのかを確認します。Laravelではlogging.phpにメッセージを出力するログファイル、ログのフォーマット、ログレベルなどを設定できます。
例えば下のような設定であったとしたら、logging.phpにはalertレベルとinfoレベルのログファイルの設定しかされていません。では、Log::warning();
をするとどのファイルに出力されるのでしょうか?
<?php
declare(strict_types=1);
return [
'default' => env('LOG_CHANNEL', 'info'),
'channels' => [
'info' => [
'driver' => 'single',
'path' => storage_path('logs/info.log'),
'level' => 'info',
],
'alert' => [
'driver' => 'single',
'path' => storage_path('logs/alert.log'),
'level' => 'alert',
],
],
];
この場合、デフォルトのチャンネルがinfo, そしてinfoチャンネルのレベルはinfoに設定されているので、info.logに出力されます。
infoレベルの場合、info以上(info, notice, warning, error, critical, alert, emergency)のレベルのメッセージが記録されます。alert.logはalertレベル以上のメッセージしか記録されないので、Log::warning()
のメッセージは記録されません。
'info' => [
'driver' => 'single',
'path' => storage_path('logs/info.log'),
'level' => 'info',
],
Log::debug()
をコードに仕込んでもどのファイルにも出力されない、ということですね...
最後に
もしかしたら設定次第ではどこにも出力されないLogが存在してるかも...?と思うと、もっとlogging.phpとLogのレベルに注意を払っていこうと感じました。
参考になれば幸いです🍎
参考