【市場価値がわかる】エンジニア転職におすすめなサイト

Laravelでログファイルを分ける方法!カスタムのやり方も解説

20代の転職ならマイナビジョブ

Laravelでログファイルを分けたいなあ….

こんな疑問を解決します。

Laravelでは、初期状態だとログの出力はstorage/logs/laravel.logに全て表示されます。

しかし、デバッグログやエラーログなどが混在してみにくいですよね。

この記事では、ログのファイルを分けて以下のようにみやすくします。

↓↓↓

ファイルもわかりやすくするために日にちごとに振り分けていきます。

Contents

動作確認

Docker 20.10.7
PHP 7.4.22
Laravel 8.53.1
mySQL 5.7
データベースのツール phpmyadmin

Laravelでログファイルを分けるにはlogging.phpを変更する

Laravelでログファイルを分ける場合は、config/logging.phpを変更します。

<?php
 
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'),
 
    /*
    |--------------------------------------------------------------------------
    | 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' => ['debug', 'info', 'error'],
        ],
 
        // デバッグログ
        'debug' => [
            'driver' => 'daily',
            'path' => storage_path('logs/debug/debug.log'),
            'level' => 'debug',
            'days' => 7,
            'permission' => 0664,
        ],
 
        // infoログ
        'info' => [
            'driver' => 'daily',
            'path' => storage_path('logs/info/info.log'),
            'level' => 'info',
            'days' => 7,
            'permission' => 0664,
        ],
 
        // エラーログ
        'error' => [
            'driver' => 'daily',
            'path' => storage_path('logs/error/error.log'),
            'level' => 'notice',
            'days' => 7,
            'permission' => 0664,
        ],
 
        'daily' => [
            'driver' => 'daily',
            'path' => storage_path('logs/laravel.log'),
            'level' => 'debug',
            'days' => 14,
        ],
 
        'slack' => [
            'driver' => 'slack',
            'url' => env('LOG_SLACK_WEBHOOK_URL'),
            'username' => 'Laravel Log',
            'emoji' => ':boom:',
            'level' => 'critical',
        ],
 
        'papertrail' => [
            'driver'  => 'monolog',
            'level' => 'debug',
            'handler' => SyslogUdpHandler::class,
            'handler_with' => [
                'host' => env('PAPERTRAIL_URL'),
                'port' => env('PAPERTRAIL_PORT'),
            ],
        ],
 
        'stderr' => [
            'driver' => 'monolog',
            'handler' => StreamHandler::class,
            'with' => [
                'stream' => 'php://stderr',
            ],
        ],
 
        'syslog' => [
            'driver' => 'syslog',
            'level' => 'debug',
        ],
 
        'errorlog' => [
            'driver' => 'errorlog',
            'level' => 'debug',
        ],
    ],
 
];

‘channels’ => [‘debug’, ‘info’, ‘error’]と記載します。

        // デバッグログ
        'debug' => [
            'driver' => 'daily',
            'path' => storage_path('logs/debug/debug.log'),
            'level' => 'debug',
            'days' => 7,
            'permission' => 0664,
        ],

ここに注目してください。

‘driver’ => ‘daily’でファイル名-2021-10-21.logのように出力します。
‘path’でパスを指定で、’laravel’はログレベルです。ログレベルには、noticeやinfo、errorやemergencyなどがあります。
そして、’days’=>7で7日間ファイルを保持することを表し、’permission’を0664にすることで、作成者によってログファイルが書き込めないことを防ぎます。

ログレベルは上に行けばいくほど緊急度が高い。
emergency
alert
critical
error
warning
notice
info
debug

ログファイルにログが出力されるか確認する

準備はできたので、それぞれのログファイルにログが出力されるか確認しましょう。

        Log::info('infoにログを出力');
        Log::debug('デバッグ開始');
        Log::debug($date);
        Log::debug('デバッグ終わり');
        Log::error('errorにログを出力');
[2021-10-21 21:04:15] local.INFO: ログエラーテスト  
[2021-10-21 21:04:15] local.INFO: infoにログを出力  
[2021-10-21 21:04:15] local.DEBUG: デバッグ開始  
[2021-10-21 21:04:15] local.DEBUG: 2021/10/30 23:59:59  
[2021-10-21 21:04:15] local.DEBUG: デバッグ終わり  
[2021-10-21 21:04:15] local.ERROR: errorにログを出力  
[2021-10-21 21:04:15] local.ERROR: errorにログを出力  
[2021-10-21 21:04:15] local.INFO: ログエラーテスト  
[2021-10-21 21:04:15] local.INFO: infoにログを出力  
[2021-10-21 21:04:15] local.ERROR: errorにログを出力  

ログのファイルを分けられました。

ただ、Laravelでは上記のように完全には分離できないので、注意が必要です。※ログレベルによって変わるから。

さらにlogging.phpを変更してログファイルを作成する

debug,error,infoのログファイルを作成しましたが、新たにログレベルが一番高いemergencyを作成します。

まずはlogging.phpを以下のように変更します。

    'channels' => [
        'stack' => [
            'driver' => 'stack',
            'channels' => ['debug', 'info', 'error', 'emergency'],←emergencyを追加
        ],
        // 非常事態ログ
        'emergency' => [
            'driver' => 'daily',
            'path' => storage_path('logs/emergency/emergency.log'),
            'level' => 'emergency',
            'days' => 7,
            'permission' => 0664,
        ],

ログを出力させます。

        Log::info('infoにログを出力');
        Log::debug('デバッグ開始');
        Log::debug($date);
        Log::debug('デバッグ終わり');
        Log::error('errorにログを出力');
        Log::emergency('非常事態!');

すると、emergencyはログレベルが一番高いので、全てのログファイルに非常事態!とでます。

[2021-10-21 21:12:31] local.EMERGENCY: 非常事態!  
[2021-10-21 21:12:31] local.INFO: ログエラーテスト  
[2021-10-21 21:12:31] local.INFO: infoにログを出力  
[2021-10-21 21:12:31] local.DEBUG: デバッグ開始  
[2021-10-21 21:12:31] local.DEBUG: 2021/10/30 23:59:59  
[2021-10-21 21:12:31] local.DEBUG: デバッグ終わり  
[2021-10-21 21:12:31] local.ERROR: errorにログを出力  
[2021-10-21 21:12:31] local.EMERGENCY: 非常事態!  

ログファイルをカスタムして任意のログファイルを出力する

自分でログファイル名をカスタムし、任意のファイルにログを出力したい場合もあるでしょう。

できます。

試しにtestというログファイルを作成してログを出力します。

    'channels' => [
        'stack' => [
            'driver' => 'stack',
            'channels' => ['debug', 'info', 'error', 'emergency', 'test'],←testというログファイルを追加
        ],
        // テストログ
        'test' => [
            'driver' => 'daily',
            'path' => storage_path('logs/test/test.log'),
            'level' => 'critical',
            'days' => 7,
            'permission' => 0664,
        ],

pathを指定し、ログレベルはcriticalに設定しました。上から3番目ぐらいの緊急度です。

Log::channel('test')->critical('ログテスト');

自分でログファイルを作成する場合は、上記のようにLog::channel(‘ログファイル名’)->ログレベル(‘出力する内容’)みたいに書きます。
例えば、ログレベルがerrorなら、
Log::channel(‘ログファイル名’)->error(‘出力する内容’)
debugなら、
Log::channel(‘ログファイル名’)->debug(‘出力する内容’)
とすることで、任意のファイルにログを出力できます。

[2021-10-21 21:29:23] local.CRITICAL: ログテスト  

ログの出力が確認できました。

【まとめ】Laravelでログファイルを分ける方法

今回は、Laravelでログファイルを分ける方法について解説しました。

ログファイルはカスタムできるので、開発に合わせて自由に分けてみてくださいね!

このブログでは他にも実務に役立つLaravelの記事を解説しているので合わせてチェックしてください。

20代の転職ならマイナビジョブ

現役エンジニアに相談するならMENTA(おすすめ)

スキルを売り買いするならココナラ

動画教材ならUdemy

コメント

コメントする

CAPTCHA


Contents
閉じる