BackEnd

[Laravel] ログの扱い方 [5.8]

投稿日:

はじめに

こんにちは。今回は表題通り、Laravel5.8でのログの扱い方です。
わざわざバージョンを記載しているのは、2019年7月現在のLTSである5.5と5.6以降で大きな変更があったためです。本記事の内容は5.5以前には適用できない可能性がありますので、ご注意ください。

環境

  • PHP 7.3.6
  • Laravel 5.8.28

Monologについて

Laravelのログ機能はMonologのラッパーであり、これは5.8になっても同じです。変わったのはログの呼び出し方や設定方法のようです(私は5.8からLaravelを使い始めたので、5.5以前の書き方は把握していません…)。
なおMonolog自体はLaravelとは本来関係ないパッケージのため、Laravel公式のドキュメントよりはMonolog単体で調べた方が、まとまった情報を得ることができると思います。

コード上で設定する方法

では早速Laravelでの使い方を見ていきます。簡単かつMonologに不慣れな人でもパッと見で分かりやすいのは、コード上で全て設定してしまう方法です。
以下は「ユーザー登録時にLaravel標準とは別にログを出力したい」という意図のコードです。

  • $log_path: ログのファイルパスです。アプリケーションのどこに設置してもいいのですが、ヘルパ関数の storage_path() を使って storage/logs 以下を指定するのが慣例です。
  • $days: ログの保存日数です。この場合はログが90日間保存され、その後は古い順に削除されます。「0」を指定すると無期限で保存されます。
  • $log_level: ログレベルはPHPのデファクトであるPSR-3に準拠しています。https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md#5-psrlogloglevel
  • $bubble: 他のハンドラに処理続行させるかのフラグです。Laravelでは…というかMonologでは複数のログハンドラを同時に起動してログ出力ができます。イメージ的には、バリデーションでエラー検知時にバリデーションを継続させるのに近いと思います。
  • $filePermission: これは読んで字の如く、ログファイルのパーミッションです。 chmod と同じように指定できます。
  • RotatingFileHandler: Monologが最初から用意しているログハンドラで、ログファイルを日毎にローテーションしてくれます。他にも標準出力にログを吐き出す StreamHandler 、Slackに手軽にPOSTできる SlackHandler など、様々なハンドラがあり、実体は vendor/monolog/monolog/src/Monolog/Handler 以下にあります。
  • LineFormatter: ログ文面のフォーマットを指定します。何も指定しない場合は const SIMPLE_FORMAT = "[%datetime%] %channel%.%level_name%: %message% %context% %extra%\n"; というフォーマットに沿って出力されます。

ControllerやServiceに書いてしまうのはあまりスマートではなく、コードの肥大化も招きます。trait化したり、設定値を .envconfig に追い出すことで可読性を保てるのではないでしょうか。
上記のコードで storage/logs/user-register-[YYYY-MM-DD].log が生成され、以下のようなログが出力されます。
storage/logs/laravel-[YYYY-MM-DD].log はLaravelデフォルトのログで、 config/logging.php の設定に沿って出力されます(後述)。

config/logging.phpで設定する方法

5.6以降で追加された設定ファイルで、公式ドキュメントを見る限り、恐らくこちらが推奨の方法だと思います。

stack, single, dailyはデフォルトの設定項目で、 user-register が追記した項目です。

  • driver: 前述のコードで new Logger() した時の引数に相当します。Monologでは複数のchannelを登録し、一度に複数の出力先にログを吐き出すことが可能です(このへんがまだ理解が浅く、正しい解釈なのか不安です…)。一番上の stack だけは少し特殊で、複数のchannelを記述して一括登録することが可能です(channelsが配列になっているのはそのためのようです)。
  • level: 前述の $log_level に相当します。
  • path: 前述の $log_path に相当します。
  • days: 前述の $days に相当します。

アプリケーションでは以下のように記述することで、最初のコードと同様に storage/logs/user-register-[YYYY-MM-DD].log にログが出力されます。コード量が目に見えて減りました!複雑な仕様でなければ、設定ファイルのへ記述で済ませてしまうのがベターだと思います。

おまけ:ログレベルについて

上述のPSR-3で定義されているログレベルはあくまでも目安です。今回の例では「正常にユーザー登録が完了した」ときのログですのでやerrorやwarningではおかしいですが、noticeなのか、infoなのかは要件次第になるでしょう。
以下のページでログレベル一覧および一例が完結にまとまっていましたので、紹介いたします。

ログレベルちゃんと使い分けてますか?

さいごに

「ログの出し分けをしたい」という要件から始まって、Laravelのログ出力について調査したのですが、一度理解してしまえば実に簡単です。豊富な出力先を選べるのもいいですね。

おすすめ書籍

PHPフレームワーク Laravel Webアプリケーション開発 バージョン5.5 LTS対応 PHPフレームワーク Laravel入門

blog-page_footer_336




blog-page_footer_336




-BackEnd
-, ,

執筆者:


comment

メールアドレスが公開されることはありません。

CAPTCHA


関連記事

laravel logo

LaravelのFacade(ファサード)とは? 何気なく使用していた裏側の仕組みを解説!

1 はじめに1.1 Facadeを使用しているクラス2 Facadeの仕組み3 Facadeの作成3.1 サンプルコードに必要な実装3.2 Serviceの作成3.3 Facadeクラスの作成3.4 ...

laravel logo

Laravelの開発環境構築

1 はじめに2 開発環境構築2.1 Homestead2.2 Laradock3 Laradockで開発環境構築3.1 Laradockのダウンロード3.2 コンテナの設定ファイルを作成3.3 コンテ ...

rails

RailsでERBからJavaScriptにhashを渡す方法

1 はじめに2 カスタムデータ属性とは3 実装例3.1 コントローラの実装3.2 ビューの実装3.3 実行結果4 さいごに はじめに 以前、選択したプルダウンメニューに応じて別のプルダウンメニューの内 ...

麻雀で自分が何を切るか学習させる

1 はじめに2 プロジェクト名を決めてみる3 何切る問題で考慮される要素3.1 手牌3.2 ドラ3.3 考慮していない要素(本当は入れたい)4 学習の方法5 さいごに はじめに 前回執筆しました、配牌 ...

Kotlinでのnullの基本的な扱いかた

1 はじめに2 基本的にnullを許容しない3 nullを許容するNullable4 Nullableをnon-nullに変える4.1 nullチェックとスマートキャスト4.2 エルビス演算子4.3 ...

フォロー

blog-page_side_responsive

2019年7月
 123456
78910111213
14151617181920
21222324252627
28293031  

アプリ情報

私たちは無料アプリもリリースしています、ぜひご覧ください。 下記のアイコンから無料でダウンロードできます。