見出し画像

Laravel 学習記録 #009 ログを学ぶ

Laravelのログについて学習したものをまとめてます。

ログってなに?

  • イベントやエラーを記録し、追跡可能な形で保存しているやつ

  • エラー時にはバグを特定する手掛かりになってくれる

  • Laravelでは8つのログレベルを提供している

  • ファサードもしくはヘルパーで使える

使ってみる

何すりゃいいんだ状態なので一度マニュアル確認

アプリケーションのログ動作のすべての設定オプションは、config/logging.php設定ファイルであります。このファイルでアプリケーションのログチャンネルを設定しているため、使用可能な各チャンネルとそのオプションを必ず確認してください。

https://readouble.com/laravel/10.x/ja/logging.html

ということで
設定に関してはconfig/logging.phpでやるんですね。
まず使い方から確認したいので一旦スルーします。

使い方

  • ファサードを使う

  • ヘルパーを使う

の2つの方法があります。

ファサードを使う

Logファサードを使用して
Log::ログレベルのメソッド(出力内容)
として出力可能です。

コントローラーで確認してみます。
ページアクセス時に8つのログが出力されるようにしてみます。

<?php

namespace App\Http\Controllers;

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

class LogController extends Controller
{
    public function index()
    {
        // ログ出力
        Log::emergency("emergency ファサードでログ出力確認");
        Log::alert("alert ファサードでログ出力確認");
        Log::critical("critical ファサードでログ出力確認");
        Log::error("error ファサードでログ出力確認");
        Log::warning("warning ファサードでログ出力確認");
        Log::notice("notice ファサードでログ出力確認");
        Log::info("info ファサードでログ出力確認");
        Log::debug("debug ファサードでログ出力確認");
    }
}

結果
storage/logs/laravel.log
に結果が出力されます。

[2023-09-20 10:58:24] local.EMERGENCY: emergency ファサードでログ出力確認  
[2023-09-20 10:58:24] local.ALERT: alert ファサードでログ出力確認  
[2023-09-20 10:58:24] local.CRITICAL: critical ファサードでログ出力確認  
[2023-09-20 10:58:24] local.ERROR: error ファサードでログ出力確認  
[2023-09-20 10:58:24] local.WARNING: warning ファサードでログ出力確認  
[2023-09-20 10:58:24] local.NOTICE: notice ファサードでログ出力確認  
[2023-09-20 10:58:24] local.INFO: info ファサードでログ出力確認  
[2023-09-20 10:58:24] local.DEBUG: debug ファサードでログ出力確認


ヘルパで出力

loggerヘルパーを利用して
logger()->ログレベルメソッド(出力内容)
とします。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class LogController extends Controller
{
    public function index()
    {
        // ログ出力
        logger()->emergency("emergency ヘルパでログ出力確認");
        logger()->alert("alert ヘルパでログ出力確認");
        logger()->critical("critical ヘルパでログ出力確認");
        logger()->error("error ヘルパでログ出力確認");
        logger()->warning("warning ヘルパでログ出力確認");
        logger()->notice("notice ヘルパでログ出力確認");
        logger()->info("info ヘルパでログ出力確認");
        logger()->debug("debug ヘルパでログ出力確認");
    }
}

結果
こちらもstorage/logs/laravel.logで結果を確認してみます。

[2023-09-20 11:02:37] local.EMERGENCY: emergency ヘルパでログ出力確認  
[2023-09-20 11:02:37] local.ALERT: alert ヘルパでログ出力確認  
[2023-09-20 11:02:37] local.CRITICAL: critical ヘルパでログ出力確認  
[2023-09-20 11:02:37] local.ERROR: error ヘルパでログ出力確認  
[2023-09-20 11:02:37] local.WARNING: warning ヘルパでログ出力確認  
[2023-09-20 11:02:37] local.NOTICE: notice ヘルパでログ出力確認  
[2023-09-20 11:02:37] local.INFO: info ヘルパでログ出力確認  
[2023-09-20 11:02:37] local.DEBUG: debug ヘルパでログ出力確認

こんな感じでどちらも同じ結果が得られます。
機能的には同じっぽいのでどちらを採用するかはチームの方針次第ですかね。

ログの設定

config/logging.phpを確認する
このdefaultに設定されたチャンネルが、使用されるチャンネルになる。
デフォルトではenvファイルのLOG_CHANNELを設定
→stackチャンネルが設定されている。

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


// envはいじってなければ以下になっている
LOG_CHANNEL=stack

該当箇所(stackチャンネル)を見る
config/logging.php

'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,
        ],




 // ...省略
    ],

stackチャンネル
他のログチャンネルをスタックして連続してログを記録するためのチャンネルです。
'channels' => ['single']というで
stackチャンネルで使用する他のチャンネルを指定できます。
ここでは'single' チャンネルを使うという意味になります。
これは複数のチャンネルを指定することもできて、その場合は左から順番に実行されます。

'ignore_exceptions' => false:
は例外を無視せずにログに記録するということらしい。

そして、各チャンネルの設定で、どこに出力されるかなどが、設定されます。例:'path' => storage_path('logs/laravel.log')

操作日ごとにログファイルを出そうと思ったらdailyチャンネルを使用して

'default' => env('daily', 'stack')   // defaultをdailyにする

または

'channels' => [
        'stack' => [
            'driver' => 'stack',
            'channels' => ['daily'],  // dailyチャンネルを使う
            'ignore_exceptions' => false,
        ],

とすることで日付ごとにファイルが出力されます。
storage/logs/laravel-2023-09-20.log
というような日付の名前が付与されたファイル名で出力

[2023-09-20 11:35:27] local.EMERGENCY: emergency ログ出力確認  
[2023-09-20 11:35:27] local.ALERT: alert ログ出力確認  
[2023-09-20 11:35:27] local.CRITICAL: critical ログ出力確認  
[2023-09-20 11:35:27] local.ERROR: error ログ出力確認  
[2023-09-20 11:35:27] local.WARNING: warning ログ出力確認  
[2023-09-20 11:35:27] local.NOTICE: notice ログ出力確認  
[2023-09-20 11:35:27] local.INFO: info ログ出力確認  
[2023-09-20 11:35:27] local.DEBUG: debug ログ出力確認


自作のチャンネル

チャンネルはもとに用意してあってもの以外に、独自で用意することもできます。
例として、監視用のログ('monitor')と、エラー用のログ('error')を用意し、'stack'チャンネルで両方を使うように設定してみます。

'channels' => [
		'stack' => [
        'driver' => 'stack',
        'channels' => ['monitor', 'error'],
        'ignore_exceptions' => false,
    ],

    // 監視用ログチャンネル
    'monitor' => [
        'driver' => 'daily', // 日付ごとのファイルに出力
        'path' => storage_path('logs/monitor.log'), // ファイルの出力先
        'level' => 'info', // INFO レベル以上のログを出力
    ],

    // エラーログチャンネル
    'error' => [
        'driver' => 'daily', // 日付ごとのファイルに出力
        'path' => storage_path('logs/errors/error.log'), // エラーログファイルの出力先
        'level' => 'error', // ERROR レベル以上のログを出力
    ],

    // ...
],

日付ごとのファイルに出力するためにdriverをdailyに設定します。

pathで出力先を設定します。
監視用のログは'logs/monitor.log'
エラー用のログは'logs/errors/error.log'

levelを設定します。
監視用はinfo以上
エラー用はerror以上
設定したレベルより上のログが出力されるようになります。

確認
ヘルパとファサードの確認で用意したものと同じく8つのログレベルを出力して確認した実行結果を確認します。

監視ログ
storage/logs/monitor-2023-09-20.log

[2023-09-20 11:44:31] local.EMERGENCY: emergency チャンネル設定ログ出力確認  
[2023-09-20 11:44:31] local.ALERT: alert チャンネル設定ログ出力確認  
[2023-09-20 11:44:31] local.CRITICAL: critical チャンネル設定ログ出力確認  
[2023-09-20 11:44:31] local.ERROR: error チャンネル設定ログ出力確認  
[2023-09-20 11:44:31] local.WARNING: warning チャンネル設定ログ出力確認  
[2023-09-20 11:44:31] local.NOTICE: notice チャンネル設定ログ出力確認  
[2023-09-20 11:44:31] local.INFO: info チャンネル設定ログ出力確認

エラーログ
storage/logs/errors/error-2023-09-20.log

[2023-09-20 11:44:31] local.EMERGENCY: emergency チャンネル設定ログ出力確認  
[2023-09-20 11:44:31] local.ALERT: alert チャンネル設定ログ出力確認  
[2023-09-20 11:44:31] local.CRITICAL: critical チャンネル設定ログ出力確認  
[2023-09-20 11:44:31] local.ERROR: error チャンネル設定ログ出力確認

それぞれのログで、出力先、ファイル名、出力レベルが設定の通りになっていることがわかりました。

設定も、使い方も簡単でいいですね。
どのレベルで出力するようにするのかは、機能やチームの方針次第かもです。

おまけ

Logレベルの使い分けについてchatGPT君に聞いてみました
成功はinfo
エラーはerrorみたいな感じでコードを作ってください。

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

class OrderController extends Controller
{
    public function placeOrder(Request $request)
    {
        try {
            // ユーザの注文処理を行う

            // ユーザの注文が成功した場合
            Log::info('注文が成功しました。注文番号: ' . $orderNumber);

            return response()->json(['message' => '注文が成功しました。注文番号: ' . $orderNumber]);
        } catch (\Exception $e) {
            // 注文処理中にエラーが発生した場合
            Log::error('注文処理中にエラーが発生しました。エラーメッセージ: ' . $e->getMessage());

            return response()->json(['error' => '注文処理中にエラーが発生しました。'], 500);
        }
    }
}

この記事が気に入ったらサポートをしてみませんか?