📑

Laravelのログにクラス名や行番号を出力する

4 min read

はじめに

この記事を読むと、Laravelのログにクラス名、ファイル名、メソッド名、行番号を出力できるようになります。
ログのフォーマットや時刻のフォーマットはconfigファイル(logging.php)で定義します。

バージョン情報

  • PHP: 8.0.11
  • laravel/framework: 8.54

実装

handlerを追加する

ログファイルを日毎にローテーションするRotatingFileHandlerをカスタマイズします。
プロセッサを追加したい場合はこのクラスをカスタマイズしてください。

app/Logging/CustomRotatingFileHandler.php
<?php

namespace App\Logging;

use Monolog\Handler\RotatingFileHandler;
use Monolog\Logger;
use Monolog\Processor\IntrospectionProcessor;

class CustomRotatingFileHandler extends RotatingFileHandler
{
    public function __construct(string $filename, int $maxFiles = 0, $level = Logger::DEBUG, bool $bubble = true, ?int $filePermission = null, bool $useLocking = false)
    {
        $this->pushProcessor(new IntrospectionProcessor($level, ['Illuminate\\']));
        parent::__construct($filename, $maxFiles, $level, $bubble, $filePermission, $useLocking);
    }
}

logging.php

logging.phpのchannelsに以下を追加します。

config/logging.php
        'applog' => [ 
            'driver'  => 'monolog',
            'level' => env('LOG_LEVEL', 'debug'),
            'handler' => CustomRotatingFileHandler::class,
            'handler_with' => [
                'filename' => storage_path('logs/app.log'),
                'maxFiles' => 7,
            ],
            'formatter' => LineFormatter::class,
            'formatter_with' => [
                'format' => '%datetime% %level_name% (%extra.class%:%extra.line%) %extra.function%: %message%'. PHP_EOL,
                'dateFormat' => 'Y-m-d H:i:s.v',
                'allowInlineLineBreaks' => true,
            ],
        ],
項目 フォーマット
システム時刻 %datetime%
ログレベル %level_name%
クラス名 %extra.class%
ファイル名 %extra.file%
行番号 %extra.line%
関数名 %extra.function%
メッセージ %message%

詳細はMonolog公式ドキュメントのIntrospectionProcessor.phpをご覧ください。

.env

ログチャンネル、レベルを定義します。

.env
LOG_CHANNEL=applog
LOG_LEVEL=debug

実行結果

実行結果は以下の通りです。
vscodeでクラス名をCtrl+クリックすると、対象ファイルの指定行に飛んでくれます。

$ tail -f ./storage/logs/app-2021-10-01.log
2021-10-01 08:37:06.377 DEBUG (App\Http\Controllers\Auth\SocialLoginController:42) redirectToProvider: start.
2021-10-01 08:37:06.379 DEBUG (App\Http\Controllers\Auth\SocialLoginController:49) redirectToProvider: [google]認証ページにリダイレクト start.
2021-10-01 08:37:06.381 DEBUG (App\Http\Controllers\Auth\SocialLoginController:55) redirectToProvider: 認証ページにリダイレクト end.
2021-10-01 08:37:06.382 DEBUG (App\Http\Controllers\Auth\SocialLoginController:56) redirectToProvider: end.
2021-10-01 08:37:06.862 DEBUG (App\Http\Controllers\Auth\SocialLoginController:73) handleProviderCallback: start.
2021-10-01 08:37:06.863 DEBUG (App\Http\Controllers\Auth\SocialLoginController:74) handleProviderCallback: SNSユーザー情報取得 start.
2021-10-01 08:37:07.118 DEBUG (App\Http\Controllers\Auth\SocialLoginController:76) handleProviderCallback: SNSユーザー情報取得 end.
2021-10-01 08:37:07.130 DEBUG (App\Http\Controllers\Auth\SocialLoginController:86) App\Http\Controllers\Auth\{closure}: SNSユーザー登録済み.
2021-10-01 08:37:07.186 DEBUG (App\Http\Controllers\Auth\SocialLoginController:129) handleProviderCallback: 二段階認証が無効.
2021-10-01 08:37:07.190 DEBUG (App\Http\Controllers\Auth\SocialLoginController:138) handleProviderCallback: end.

まとめ

コンストラクタを改修しただけのとてもシンプルな実装です。
フォーマットをlogging.phpに外出ししているので、修正しやすいかと思います。

さらに、デバッグ効率向上のため、Telescope拡張のTelescope plusパッケージを作成しました。
まだ、SQLの呼び出し階層を出力する機能だけですが、よろしければご活用ください。

https://zenn.dev/yamabiko/articles/laravel-telescope-plus

また、ログを出力するようになると、表面には出てこないエラーを発見することがあるかもしれません。
筆者の場合、vscodeの拡張機能がトリガーとなって、こっそりとエラーを出力し続けていた、なんてこともありました。
そのときのことをまとめたのが以下の記事です。

https://zenn.dev/yamabiko/articles/laravel-extra-intellisense-issue1

もし、ご参考になるようでしたら幸いです😄

Discussion

ログインするとコメントできます