【Laravel】Log入門

2021/11/21

はじめまして!ヨコイと申します。

今回はLaravelのLogに関して書いていきたいと思います。
バグを未然に防いだり、保守のためにログを読んでアプリケーションの状態を把握するということは重要です。
Laravelにはログを出力するための豊富な機能が揃っております。

基本の設定

Laravelのログの設定はconfig/logging.phpというファイルにまとめられております。
このファイルの中には複数のログチャンネル(ログの出力方法のようなもの)というものが定義されており、その中から選択して使用します。(デフォルトではstackチャンネルが選択されます。stackチャンネルはこの設定では一つのログファイルにログを集約するsingleチャンネルを設定したログチャンネルです。)
各チャンネルに関する設定もconfig/logging.phpの各チャンネルに記載します。

<?php

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

return [

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

    'channels' => [
        'stack' => [
            'driver' => 'stack',
            'channels' => ['single'],
            '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,
        ],

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

];


設定方法

デフォルトのstackチャンネルではかなり可読性が悪くなってしまうのでチャンネルを変えたいと思います。
おそらく多くの現場で開発環境用の環境変数を用意してそちらを読み込む方法が一般的かと思いますので.envにてチャンネルを指定する方法を説明します。といってもかなり簡単です。

.envファイルに下記を追記します。もしくは修正します。

LOG_CHANNEL=daily

このように追記することで先ほど説明したlogging.phpに定義されたdailyチャンネルが使用されます。(簡単ですね!)
よく使う(であろう)dailyチャンネルについて説明します。

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

dailyチャンネルにはdaysというオプションがあります。
デフォルトでは14が設定されていますが、これは14日分のログファイルが保存されるということです。この値を0に設定するとログファイルが削除されることはありません。

dailyチャンネルの他にもslackにメッセージを送信するチャンネルなど便利そうなものも揃っているので、使ってみる機会があった場合には追記していきたいと思います。

ログの出力

ログファサードを使ってログに書き込むことも可能です。

use Illuminate\Support\Facades\Log;
public function logInset($message){
	Log::debug($message);
}

以下、出力例

[2021-10-17 09:24:02] testing.DEBUG: {"foo":"bar"}

またログにはレベルが存在します。
emergency > alert > critical > error > warning > notice > info > debug
重要度の高い順に左から並んでいます。

まとめ

開発時にはあらゆる場面でログが活用されるので、ログの設定をカスタマイズすることはかなり重要だと捉えています。
開発効率を上げられるよう、学習していきたいですね。