PHP - ログ - Laravel ログ ローテーション


クラウディア 


1. 概要
2. デフォルト
3. ローテーション
4. あかん
5. システムにまかせる

1. 概要

 ふと、気づくと、「Laravel」のログファイルが、えらい大きくなっておりました。  本ページは、下記のサイトを参考にさせていただきました。
Laravel のログを日別でローテーションさせる( +自動削除 )」
「Laravel で Log ファイルの作成 ログファイルをローテーション

2. デフォルト

 「Laravel」のログファイルは。

project_path/storage/logs/laravel.log
 であります。  参考サイトの記事によれば、ログローテーションの設定は、

/プロジェクトパス/.env
 に記述してあるそうで・・・。  運用しているサイトのものを見てみたら

LOG_CHANNEL=stack
 となっておりました。  まぁ、これがデフォルトなのだそうで・・・。  デフォルト設定値の意味は、参考サイトによれば、「『マルチチャンネル』チャンネルを作成するためのラッパー機能」だそうで、読んでもよく意味が分かりません。

3. ローテーション

 ローテーションさせるには、前項の値を

LOG_CHANNEL=daily
 に設定するのだそうです。  説明には「RotatingFileHandler ベースの毎日ファイルを切り替える Monolog ドライバ」と書いてあって、よくわかりませんが、とりあえず、「daily」にローテーションさせるようです。  なんか、候補に「weekly」や「montly」がないのも気になりますが・・・。  これ、「daily」にした場合、1日1回のローテーションだそうですが、前日のログファイルをどこまで残すかに関しては、

/プロジェクトパス/config/logging.php
 を編集するのだそうであります。  なにもいじっていない状態で、上記のファイルを見てみました。  めぼしいところを記述すると(バージョンは「Laravel Framework 8.40.0」)

    /*
    |--------------------------------------------------------------------------
    | Default Log Channel
    |--------------------------------------------------------------------------
    |
    | This option defines the default log channel that gets used when writing
    | messages to the logs. The name specified in this option should match
    | one of the channels defined in the "channels" configuration array.
    |
    */

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

    /*
    |--------------------------------------------------------------------------
    | Log Channels
    |--------------------------------------------------------------------------
    |
    | Here you may configure the log channels for your application. Out of
    | the box, Laravel uses the Monolog PHP logging library. This gives
    | you a variety of powerful log handlers / formatters to utilize.
    |
    | Available Drivers: "single", "daily", "slack", "syslog",
    |                    "errorlog", "monolog",
    |                    "custom", "stack"
    |
    */

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

        'slack' => [
            'driver' => 'slack',
            'url' => env('LOG_SLACK_WEBHOOK_URL'),
            'username' => 'Laravel Log',
            'emoji' => ':boom:',
            'level' => env('LOG_LEVEL', 'critical'),
        ],
 となっております。  まぁ、大概のサイトでは、これをいじる・・・と。  「.env」の設定はそのままに、31日間キープ、パーミッションもつけて

    'channels' => [
        'stack' => [
            'driver' => 'stack',
            'channels' => ['daily'],					★
            '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' => 31,								★
			'permission' => 0666,						★
        ],
 「★」の行がいじってあるところですな。  まぁ、ちょいとこれで、やってみますか・・・。  ただ、いちいちこれも面倒なので、「FreeBSD」の場合「loglotate」にまかす手もあるかとは思いますが、まだこれはやってみていない・・・。

4. あかん

 2021年8月30日にしかけて、今日見てみました。

$ ls -la /プロジェクトパス/laravel/storage/logs/

・・・	略	・・・

-rw-r--r-- 1 www      www         148624  8月 30 23:59 laravel-2021-08-30.log
-rw-r--r-- 1 www      www         397878  8月 31 10:34 laravel-2021-08-31.log
-rw-r--r-- 1 www      www      121001684  8月 31 15:25 laravel.log
 げげ、なんだこれ。  ちょっとお粗末というか、馬鹿なローテーションですなぁ・・・。  以前のログは、そのまま残っているし。  そもそも、最新のログを見ようと思ったら

tail -f /プロジェクトパス/laravel/storage/logs/
 の後に、いちいち日付をうたにゃならんのか・・・。  そんなのはごめんだ。  ここは、オペレーティングシステムにまかせるかな。

5. システムにまかせる

 これ、「Windows」ではできませんわなぁ。  「Linux」だと「loglotate」の設定だとかで同じようなことができるかと思います。  「FreeBSD」はこの点、お手軽なのだ。

/usr/local/etc/newsyslog.conf.d/laravel,conf
 というファイルを置いて、中身に

# logfilename                                [owner:group] mode count size when  flags [/pid_file] [sig_num]
/プロジェクトパス/laravel/storage/logs/laravel.log www:www 644  31    *    @T00  B
 書いておきゃいいのだ。  日替わりで、ローテーションして、圧縮なして 31日分キープします。  おっと、この際、

laravel-2021-08-30.log
laravel-2021-08-31.log
 は、邪魔になるので削除します。  詳細は、「FreeBSD - メンテナンス・トラブルシュート - newsyslog・crontab」をご参照ください。  (実はちょっと謎だったのが、「*.log」と書いていけると思っていたら、何故か、それだとうまくいかない、いずれ機会があれば、調べねばならんかも・・・)  ふふふ、この点、「FreeBSD」は楽ちんなのだ。

AbemaTV 無料体験
【usus ウズウズ】