デフォルトのインストールでは、laravel.logは日次ではローテーションされません。つまり一生同じファイルにエラーなどが記録され続けます。それが嫌ならどうしましょう?

日次でローテーション

これは次のファイルの変更で簡単に設定可能です。

...
   'channels' => [
        'stack' => [
            'driver' => 'stack',
            'channels' => ['daily'], // これをsingleからdailyに変換
            'ignore_exceptions' => false,
        ],

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

        'daily' => [
            'driver' => 'daily',
            'path' => storage_path('logs/laravel.log'),
            'level' => 'debug',
            'days' => 14, // 14日でローテーション
        ],
...

こうすると、作成されるファイルは、laravel.logから、laravel-YYYY-MM-DD.logの形式に変わります。

$ ls -l 
-rw-r--r-- 1 kenji kenji    51 Apr  9 14:51 laravel-2021-04-09.log
-rw-r--r-- 1 kenji kenji 18525 Apr  3 13:14 laravel.log

そして14日経過したら、それ以前に作成されたログファイルは削除されます。つまりファイルのローテーションが実行されます。

月次でローテーション

さて、日次のローテーションではあまりにも頻繁過ぎると思うなら、今度は月次に変更してみましょう。

これはちょっと準備が要ります。デフォルトやマニュアルには直接の例がないのでちょっと調査必要でしたが可能です。

まず、以下のファイルを作成します。


namespace App\Logging;

class MonthlyFileNameForRotatingHandler
{
    /**
     * Customize the given logger instance.
     *
     * @param  \Illuminate\Log\Logger  $logger
     * @return void
     */
    public function __invoke($logger)
    {
        foreach ($logger->getHandlers() as $handler) {
            $handler->setFilenameFormat('{filename}-{date}', 'Y-m');
        }
    }
}

それから、以下のように新規のチャンネルmonthlyの作成が必要です。

...
   'channels' => [
        'stack' => [
            'driver' => 'stack',
            'channels' => ['monthly'], // これをmonthlyに変換
            'ignore_exceptions' => false,
        ],
...
        'monthly' => [
            'driver' => 'daily', // use RotatingHandler
            'tap' => [App\Logging\MonthlyFileNameForRotatingHandler::class],
            'path' => storage_path('logs/laravel.log'),
            'level' => 'info',
            'permission' => 0666,
            'days' => 12, // 12ヶ月でローテーション
        ],
...

この設定をすると、今度はファイル名はlaravel-YYYY-MM.logの形式に変わります。以下のように。

$ ls -l
-rw-r--r-- 1 kenji kenji 143 Apr  9 14:55 laravel-2021-04-09.log
-rw-rw-rw- 1 kenji kenji  45 Apr  9 15:12 laravel-2021-04.log

月次なのに'days' => 12とちょっと設定が変ですが、ローテーションの仕組みはそこで指定した数のファイルをキープして他のファイルは削除するというものなので、この場合は12日ではなく12ヶ月となります。ちなみに、どのファイルが削除されるかはファイルの日付ではなくファイル名順で決まるのでローテーションのテストをするならダミーのファイルを作成してテスト可能です。

最後に、ファイルのローテーションが要らないなら、そこには0と指定してください。永遠に作成された月次のファイルが残り続けます。

By khino