Laravelでログを出力する方法!ログの設定3選!

LaravelLaravel

Laravelでログを出力するファサードクラスやヘルパーの紹介とログを出力するときの設定など、ログ出力についてまとめています。
載せているサンプルコードはLaravel9で動作検証しました。

公式ドキュメントのこのあたりにある内容になります。

PR

Laravelのログをファサードを使用して出力する

Laravelのログをファサードのクラスを使用して出力する方法です。
下記のようなクラスを使用して、出力してみました。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;

class LogTesterController extends Controller
{
    public function outputLogFacade() {
        Log::emergency("emergency ログ!");
        Log::alert("alert ログ!");
        Log::critical("critical ログ!");
        Log::error("error ログ!");
        Log::warning("warning ログ!");
        Log::notice("notice ログ!");
        Log::info("info ログ!");
        Log::debug("debug ログ!");
    }
}

outputLogFacadeメソッドにアクセスしたら、それぞれのログレベルでメッセージを出力するようにしました。
Logファサードを使用する場合には、use文を使用してIlluminate\Support\Facades\Logを読み込んでおきます。

そして、Logクラスからそれぞれのログレベルのメソッドを呼びます。(Log::emergency, Log::alertなど)
あとはメソッドの引数に出力したい内容を渡すだけです。

ログの出力場所と内容確認

実際にブラウザから上記のメソッドにアクセスすると、ログが出力されます。

出力されるログはデフォルトで、/storage/logs/laravel.logの場所に出力されます。
開いてみると、下記のようにログ出力されていることが確認できました。

[2022-04-29 14:22:21] local.EMERGENCY: emergency ログ!  
[2022-04-29 14:22:21] local.ALERT: alert ログ!  
[2022-04-29 14:22:21] local.CRITICAL: critical ログ!  
[2022-04-29 14:22:21] local.ERROR: error ログ!  
[2022-04-29 14:22:21] local.WARNING: warning ログ!  
[2022-04-29 14:22:21] local.NOTICE: notice ログ!  
[2022-04-29 14:22:21] local.INFO: info ログ!  
[2022-04-29 14:22:21] local.DEBUG: debug ログ!

ログをみてみると、最初にログの出力された年月日・時分秒が書いています。
その後に指定したログレベルによって、ログの頭にlocal.EMERGENCYlocal.ALERTなどが出ています。
これがLog::emergencyLog::alertなど、指定メソッドの違いになります。

/storage/logs/laravel.logには、自分で出力するログ以外にもLaravelでエラーが出た場合のログが出力されます。
基本的には画面でも確認できますが、画面に出力されない場合や詳細な内容を、このファイルを確認するようにして解決すると良いです。

PR

Laravelのログをヘルパーを使用して出力する

同様の内容をヘルパーを使用して出力することもできます。
その場合はloggerヘルパーを使用します。
ファサードクラスを使用した時と同じ内容をヘルパーで書くと、下記のような形になります。

public function outputLogHelper() {
    logger()->emergency("emergency ログ!");
    logger()->alert("alert ログ!");
    logger()->critical("critical ログ!");
    logger()->error("error ログ!");
    logger()->warning("warning ログ!");
    logger()->notice("notice ログ!");
    logger()->info("info ログ!");
    logger()->debug("debug ログ!");
}

こうすることで、先ほどと同じ内容が出力されます。
クラスを使用するわけではないので、use文の読み込みも不要です。

ほとんどやることはないと思いますが、bladeファイルの中などでも使用することができます。

出力されるログレベルについて

出力できるログのレベルについてはRFC5424の仕様に順守しているようです。
公式ドキュメントのこちらに書いています。

表にすると、下記のような意味合いになります。

ログレベル内容
emergencyシステム利用不可(最重要)レベル
alert緊急対応必要なレベル
critical致命的なエラー
error一般的なエラー
warning警告レベル
notice通知レベル
infoシステム情報
debugデバッグ情報

上から優先順位の高いメッセージです。
実際に使用する際には、どのくらいのレベルでログを出力させるか、チーム内で共通認識をとって使用した方が良さそうです。

Laravelのログの設定

Laravelのログの設定に関しては、config/logging.phpに書いています。
デフォルトで使用される設定は、下記のようになっています。

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

.envファイルのLOG_CHANNELの設定を取得して、設定するようになっています。
設定がない場合はstackが設定されます。

stackの内容は、同じファイル内のchannels配列に記載されています。

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

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

デフォルトでstackが設定されていますが、stackはchannelsで指定されている配列の内容を複数設定できるチャンネルのようです。
例えば、['single', 'daily']と設定すると、channels配下のsingleとdailyに設定されている内容が同時に出力されるようでした。

ログの名前を変更したい

デフォルトでは、stackチャンネルで、channelsにはsingleが設定されています。
そのため、channels配列のsingle配列の中身を修正します。

pathの箇所を下記のように変更します。

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

そうすると、/storage/logs/hoge.logにログが出力されるようになります。

ログの出力レベルを変更する

ログの出力処理はそのまま書いた状態で、ログレベルを指定して出力内容を絞ることができます。
ログレベルを指定すると、指定されたログレベル以上のログが出力されるようになります。

先ほどのsingleのlevelの箇所に直接設定するか、.envの値をとって出力するようにしているので、.envに下記のように記載します。

LOG_LEVEL=alert

こうすると、alert以上のログしか出力されないようになります。
そのため出力されるログは、emergencyalertのみです。

ログを日別に出力する

ログを日別に出力するには、dailyのチャンネルを使用するといいです。
configファイルのstackのchannelsをdailyに変更するか、.envのLOG_CHANNELを変更します。

LOG_CHANNEL=daily

こうすると、日別でログが出力されるようになります。
出力されるログのパスには「/storage/logs/laravel-2022-04-29.log」のように年月日が入ります。

コメント

タイトルとURLをコピーしました