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


関連記事

Rust入門してみた その4 モジュール編

1 はじめに2 Rustのモジュール2.1 モジュールツリーの構築2.2 サブモジュール2.3 各モジュールの実装2.4 モジュールのプライバシー3 さいごに4 おすすめ書籍 はじめに これまでの記事 ...

Stripe Connectを使って複合プランの継続課金を実装

1 はじめに1.1 想定する継続課金1.2 想定するシチュエーション2 継続課金商品の作成2.1 プランの継続課金商品の作成2.2 ID数の継続課金商品の作成3 実装3.1 プランAとID数を30契約 ...

js

GoogleAppsScriptを使ってmBaaSの定期実行処理を実装する

1 はじめに1.1 簡単な状況説明1.2 定期実行を行う方法2 実装2.1 実装の流れ2.2 JavaScriptの実装2.3 スクリプトをアップロードする2.4 Google Apps Script ...

Next.jsでサイトマップの実装

1 はじめに2 Sitemapとは3 基本的な実装方法4 動的に生成5 複数ファイルの生成6 さいごに7 おすすめ書籍 はじめに Next.jsでサイトマップの実装を行う方法を調べたので簡単にまとめて ...

laravel logo

Laravelの基礎知識

1 はじめに2 Laravelの概要2.1 学習コストが低い2.2 Symfonyがベース2.3 DIを積極的に活用している3 ディレクトリ構成3.1 app3.2 bootstrap3.3 conf ...

フォロー

blog-page_side_responsive

2019年7月
 123456
78910111213
14151617181920
21222324252627
28293031  

アプリ情報

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