Laravelを本番リリースする際に気をつけるログローテーションの設定

  • URLをコピーしました!

ログローテーションとは、ログファイルが一定のファイルサイズに達したり、一定の期間が経過したらファイル名を変更しログファイルを切り分け、古くなったログファイルは消去する作業を言います。これによって、ログファイルの肥大化を防ぎます。

ログローテーションとは – Linux技術者認定 LinuC | LPI-Japan

Laravelは、特になにも設定しない状態だと、ログはローテーションしません。
ログの設定は config/logging.php に記載されています。
LOG_CHANNELの初期値 stack は、ログを storage/logs/laravel.log 1ファイルでずっと書き込み続けます。

<?php

use Monolog\Handler\NullHandler;
use Monolog\Handler\StreamHandler;
use Monolog\Handler\SyslogUdpHandler;

return [

    /*
    |--------------------------------------------------------------------------
    | 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'),

    /*
    |--------------------------------------------------------------------------
    | Deprecations Log Channel
    |--------------------------------------------------------------------------
    |
    | This option controls the log channel that should be used to log warnings
    | regarding deprecated PHP and library features. This allows you to get
    | your application ready for upcoming major versions of dependencies.
    |
    */

    'deprecations' => [
        'channel' => env('LOG_DEPRECATIONS_CHANNEL', 'null'),
        'trace' => false,
    ],

    /*
    |--------------------------------------------------------------------------
    | 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'),
        ],

        'papertrail' => [
            'driver' => 'monolog',
            'level' => env('LOG_LEVEL', 'debug'),
            'handler' => env('LOG_PAPERTRAIL_HANDLER', SyslogUdpHandler::class),
            'handler_with' => [
                'host' => env('PAPERTRAIL_URL'),
                'port' => env('PAPERTRAIL_PORT'),
                'connectionString' => 'tls://'.env('PAPERTRAIL_URL').':'.env('PAPERTRAIL_PORT'),
            ],
        ],

        'stderr' => [
            'driver' => 'monolog',
            'level' => env('LOG_LEVEL', 'debug'),
            'handler' => StreamHandler::class,
            'formatter' => env('LOG_STDERR_FORMATTER'),
            'with' => [
                'stream' => 'php://stderr',
            ],
        ],

        'syslog' => [
            'driver' => 'syslog',
            'level' => env('LOG_LEVEL', 'debug'),
        ],

        'errorlog' => [
            'driver' => 'errorlog',
            'level' => env('LOG_LEVEL', 'debug'),
        ],

        'null' => [
            'driver' => 'monolog',
            'handler' => NullHandler::class,
        ],

        'emergency' => [
            'path' => storage_path('logs/laravel.log'),
        ],
    ],

];

'default' => env('LOG_CHANNEL', 'stack'), を切り替えると、下に記載されている設定が有効になります。.env ファイルで LOG_CHANNEL=daily と設定すれば、ログローテーションが開始できます。

LOG_CHANNEL=daily にすると、 storage/logs/laravel-2024-10-08.log のように、1日分ずつのログファイルが出力されるようになり、指定された日数を超えたものは削除されます。
上の設定では 'days' => 14, が設定されていますので、laravel-2024-10-08.log は、14日が過ぎた2024年10月23日に削除されます。

バッチとWEB両方で実行するときの注意点(エラー)

Linuxサーバーで、WEBは apache を使っていると、ログファイルのオーナーは apache になるかなと思います。
※環境構成によって違うので、なんとなく読んでください。

-rw-r--r-- 1 apache apache 12849610 Oct 8 10:53 laravel.log

このパーミッションの設定で、別ユーザーで実行するバッチが、ログを書き込もうとするとエラーになります。
例えば、AWSのEC2では ec2-user で実行することがあると思いますが、 ec2-user で実行したバッチがログを出力しようとすると、以下のようなエラーが出ます。フォルダパスは例ですので、自分の環境に置き換えて読んでください。

The stream or file "/var/www/html/storage/logs/laravel.log" could not be opened in append mode: Failed to open stream: Permission denied

単純に書き込み権限が無いだけですので、以下の設定を加えて、新しいログファイルを作成すれば解決です。

    'channels' => [

        'daily' => [
            'driver' => 'daily',
            'path' => storage_path('logs/laravel.log'),
            'level' => env('LOG_LEVEL', 'debug'),
            'days' => 14,
            'permission' => 0775, // ここを追加
            'replace_placeholders' => true,
        ],

'permission' => 0775, を追加すればOKです。私はけっこう甘めの設定をしましたが、0664 のほうがいいかもしれません。

-rwxrwxr-x 1 apache   apache   12849610 Oct  8 10:53 laravel.log

これでバッチの実行ユーザーがapache以外でも書き込みできるようになりました。

開発環境がWindowsだとあまり書き込み権限関連のエラーが出ないことが多いので、本番リリースの際には必ず一通りの動作検証をしたいですね!

ツチノコテクノロジーに開発・保守を発注しませんか?

Laravel・Flutterの開発・保守をツチノコテクノロジーに発注しませんか?

まずはZOOMで打ち合わせ

お申し込みはこちら

ツチノコテクノロジーでは一緒に働く仲間を募集しています!

完全リモートで働きたい方へ!

詳しくは以下をご覧ください。

ツチノコテクノロジー採用サイト

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

yfukudaのアバター yfukuda 取締役・システムエンジニア

ツチノコテックアカデミアの記事は、社内で誰かが質問してくれたことに回答したときに、ついでに記載しています!(^^)/
みんなの悩みを共有すれば、きっと誰かの役に立つと信じて更新しています!

目次