Laravel プログラミング

【Laravel】ログの出力設定

Laravelにはどこにログを出力するかを設定する機能があります。

今回は基本的なログ出力設定について解説します。

解説

まず、デフォルトの設定では、ログファイルは以下に出力されるようになっています。

storage/logs/laravel.log
ShellScript

上記のログにはエラーに関するログやデバック等で仕込んだログの内容が出力されます。

上記のログが出力されるようになっている理由としては、config/logging.phpで出力するログファイルの場所と種類を設定しているためです。

以下はlogging.phpのデフォルトの設定の一部です。

[config/logging.php]

    'default' => env('LOG_CHANNEL', 'stack'),
...
    'deprecations' => [
        'channel' => env('LOG_DEPRECATIONS_CHANNEL', 'null'),
        'trace' => false,
    ],
...
    'channels' => [
        'stack' => [
            'driver' => 'stack',
            'channels' => ['single'],
            'ignore_exceptions' => false,
        ],

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

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

        'slack' => [
            'driver' => 'slack',
            'url' => env('LOG_SLACK_WEBHOOK_URL'),
            'username' => 'Laravel Log',
            'emoji' => ':boom:',
            'level' => env('LOG_LEVEL', 'critical'),
            'replace_placeholders' => true,
        ],

        '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'),
            ],
            'processors' => [PsrLogMessageProcessor::class],
        ],

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

        'syslog' => [
            'driver' => 'syslog',
            'level' => env('LOG_LEVEL', 'debug'),
            'facility' => LOG_USER,
            'replace_placeholders' => true,
        ],
PHP

チャンネルについて

まず、注目して頂きたいのが、'channels'の部分になります。

ここには上から、stack、single、daily、... などいくつかの項目が設定されていますが、この項目がどのような形式・場所でログを出力するかを決定するものにあたります。

いくつかあるうちの基本的な項目を紹介するとそれぞれ以下のようになります。

  • single

単一のログファイルを出力する基本的なチャンネルです。

このチャンネルの、以下の設定により、storage/logs/laravel.logが出力されるようになっているわけです(厳密には後ほど紹介する、stackを使っていますが)。

もちろん、ログ名を変えればその名前でログファイルが出力されるようになります。

'single' => [
    'driver' => 'single',
    'path' => storage_path('logs/laravel.log'), // 出力するログの場所と名前を変更できる
    'level' => env('LOG_LEVEL', 'debug'),
    'replace_placeholders' => true,
],
PHP

  • daily

ログローテーションを設定するチャンネルです。

これにより、単一のlaravel.logにずっとログを追記していくのではなく、日毎にログファイルをローテーションして、
別なログファイルとして出力できるようになります(例 laravel-2023-10-13.log、laravel-2023-10-14.log)。

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

  • stack

チャンネルを複数設定することができます。

これによってsingleだけではなく、他のチャンネルと組み合わせることで別々な形式でログを出力させることができるようになります。

ちなみにデフォルトの設定では、singleを直接使うのではなく、stackで複数のチャンネルのうちの1つとしてsingleを選択するようになっています。

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

  • syslog

最後にsyslogについてですが、このチャンネルはシステムログを出力する設定でして、Laravelアプリケーションのプロジェクト内にログを出力するのではなく、
サーバー内の/var/logに出力するものとなっています。

'syslog' => [
    'driver' => 'syslog',
    'level' => env('LOG_LEVEL', 'debug'),
    'facility' => LOG_USER,
    'replace_placeholders' => true,
],
PHP

環境ファイル(.env)で使用チャンネルを設定

ここまで基本的なチャンネルについて解説しましたが、実際にチャンネルを選択して設定する場合どこに記載すればいいかというと、.envファイルになります。

追記する項目として以下の通りです(デフォルト設定)。

LOG_CHANNEL=stack
PHP

上記は、チャンネルにstackを選択する設定です。

もし、単一のログファイルだけを出力したい場合は、stackではなく、singleを代わりに書いてあげれば良いです。

また、config/logging.php上のstackでチャンネルを別な複数のものに変更したかったら、stackの'channels'の配列内を使いたいチャンネルに置き換えるだけで使えるようになります。

'stack' => [
    'driver' => 'stack',
    'channels' => ['single'], // ここを書き換える
    'ignore_exceptions' => false,
],
PHP
  • この記事を書いた人

タツヤ

フリーのweb系エンジニアです。 プログラミング系やShopifyなどについて発信しています。

-Laravel, プログラミング