【Laravel】ログを日別に作成する ※ローテーション

2021年7月15日

こんにちは。今回はLaravelのログを日別に出力する方法について解説します。

今回やりたいこと

Laravelは初期状態で単一のログファイルに全てのログを出力して蓄積します。大きなシステムになると大量のログが出力されるので単一ファイルに出力するとファイルが巨大になって検索しづらくなってきます。そこでログを日別に出力してみたいと思います。要件は以下です。

  • ファイルは日別に作成する
  • 7日間だけ保存する

それでは早速解説していきます。と、その前にLaravelのログ出力の仕組みを簡単に紹介します。

Laravelログ出力の仕組み

Laravelは様々な形式でログを出力することができます。単純にファイルに出力することもできるし、slackに連携することもできます。出力先を色々定義できるのですが、それをチャンネルと言います。ファイルに出力するチャンネル、slackに出力するチャンネルといったように、独自に作成することができます。設定次第では複数のチャンネルに同時にログを出力するなんてこともできたりします。かなり柔軟にカスタマイズできると考えてよいです。

チャンネルを定義するファイルがconfig/logging.phpです。phpの配列として定義されています。チャンネルの定義はchannels要素の中に作成していきます。デフォルトでは以下のチャンネルが予め定義されています。(一部抜粋)

    '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,
        ],

上記のstack,single,dailyがチャンネル名です。このチャンネルを指定してログを出力します。チャンネルはどこで指定しているのでしょうか。logging.php内の、defaultで定義されています。


    'default' => env('LOG_CHANNEL', 'stack'),

envのLOG_CHANNELから取得すうようになっています。.envをみてみましょう。


LOG_CHANNEL=stack

デフォルトではstackチャンネルに出力することになっています。stackチャンネルはインストール時に単一のファイルに出力する設定にされていますので、storage/logs/laravel.phpにログが出力されます。

日別にファイル出力するチャンネルを作る

では先程のconfig/logging.phpに日別にファイルを出力するチャンネルを追加していきましょう。といった手前ですが、実は日別にログ出力するチャンネルはデフォルトで存在しています。dailyチャンネルです。

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

設定値を解説します。driverには出方方法を指定します。日別にログファイルを作成する場合はdailyを指定します。daysはファイルを残しておく日数です。現在日から起算してこの日数より古いファイルは自動削除されます。一般的にログローテーションと言われる設定ですね。これらの設定を使えば今回やりたいことができそうです。

設定が終わったら実際にCHANNELを指定してログを出力してみましょう。まずはCHANNELの指定から。.envを設定します。

LOG_CHANNEL=daily

これで日別にログを出力する設定は完了です。では実際にログを出力してどのようにファイルができるか確認してみましょう。tinkerからログ出力します。

Log::debug('hello world');

実行するとstorage/logsフォルダに新たにログファイルが作成されます。ファイル名はlaravel-yyyy-mm-dd.logと出力されます。yyyy-mm-dd部分は出力した日付が入ります。ファイルの中を見て、値が出力されていることを確認してみましょう。

まとめ

今回はログを日別に出力する方法を解説しました。実際のプロジェクトでもよく使用する設定ですので覚えておくと役に立つのでは無いかと思います。

Laravel

Posted by kobainmac