【Laravel】 環境ごとにログの出力レベルを変更する

こんにちは。今回はログの出力レベルに関する話です。本番と開発環境ではログの出力レベルを変更したい場合がありますよね?今回はその設定方法を解説します。

ログの出力レベルとは

皆さんはログの出力レベルをご存知ですか?出力レベルとはログの種類を緊急度別に分類したものです。出力レベルはログの緊急度に応じてレベル分けされています。緊急度が高いものから順にenergencey, alert, critical, error, warning, notice, info, debugの8つがあります。ログ出力する際、ログレベルを指定することで出力されたログがどのような類のものなのかをある程度推測することができます。

それぞれのレベルのログ出力コードは以下のように記述します。Logファサードを利用しています。

Log::emergency($message);
Log::alert($message);
Log::critical($message);
Log::error($message);
Log::warning($message);
Log::notice($message);
Log::info($message);
Log::debug($message);

本番ではデバッグのレベルは要らない

emergenceyからerrorまでは基本的にトラブル発生時のみ出力することになるので出力頻度は少ないと考えられます。NoticeやInfoなどもなにかの処理の開始と終了に出したりするので、トレースするための情報として必要です。

ではdebugはどうでしょうか。debugレベルのログはあくまで開発者にとって役立つ情報を出力します。例えば、パフォーマンスを調査するために出力するメモリ使用量、SQL文の内容、ある時点のメモリダンプなどになります。これらは往々にして膨大な量が出力されることが多くなります。そのため運用環境で使用すると以下のような問題を生み出します。

  • ストレージの圧迫
  • ログの検索性低下
  • アプリケーションのパフォーマンス低下

運用時に出力しているとログの容量が肥大化し、ストレージ不足に繋がります。また、膨大なログの中から目的の情報を探すのは至難の業です。そしてログ出力はファイル出力処理ですので膨大なファイルIOが発生し、アプリケーションの速度が低下してしまう可能性もあります。

ここまでの理由から、debugレベルのログは運用環境に出力しないほうが良いことが判ります。運用時にアプリに異常があったときは本番環境のInfo以上のログを見て、なんとなくあたりを付けて、開発環境でdebugログを見ながら原因調査をしたほうが効率が良いでしょう。という訳でようやく本題です。運用環境と開発環境で出力するログレベルを変更する設定を紹介します。

設定方法

まずは設定箇所を確認

ログの出力設定はconfig/logging.phpに記述されています。ログの出力設定はchannelという単位で作成します。Laravelインストール時点で既に多くのchannelが作成されており、どのchannelを使用するか指定するだけで様々なログの出力が可能です。

   'channels' => [
        'stack' => [
            'driver' => 'stack',
            'channels' => ['single'],
            'ignore_exceptions' => false,
        ],

        'single' => [
            'driver' => 'single',
            'path' => storage_path('logs/laravel.log'),
            'level' => env('LOG_LEVEL', 'debug'),
        ],

        'daily' => [
            'driver' => 'daily',
            'path' => storage_path('logs/laravel.log'),
            'level' => env('LOG_LEVEL', 'debug'),
            'days' => 14,
        ],

例えばsingleは単一のファイルにログを出力します。dailyは日別にファイルを分けて出力します。この他にもslackにログを出力するchannelがあったりします。本当に様々なchannelがあって便利です。

さて、この中でログの出力レベルを指定している箇所はどこでしょうか。それは各channelの中のlevelという項目です。ここでsingleのlevelに着目してみましょう。

'level' => env('LOG_LEVEL', 'debug'),

.envのLOG_LEVEL項目から取得していることがわかります。ということは.envにLOG_LEVEL項目を追加して出力レベルを設定すればOKですね。

.envを設定する

実は.envを作成時点でいかのような項目が既に作成されています。

LOG_CHANNEL=stack
LOG_LEVEL=debug

初期の状態ではdebugレベルまで出力する設定ですね。この項目は指定したログレベル以上の緊急度のログを出力します。ですのでdebug以外を出力する場合はinfo以上を出力するようLOG_LEVEL=infoと設定すれば良いです。

開発環境と運用環境、それぞれ.envのLOG_LEVELを設定すれば完了です。実に簡単ですね。

まとめ

今回はログの出力レベルを変更する方法を紹介しました。かなり前置きが長くなってしまいましたが、ログレベルを変更する理由を再確認していただけたら嬉しいです。それでは。

Laravel

Posted by kobainmac