📑

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

2021/09/28に公開

はじめに

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

バージョン情報

  • PHP: 8.2.4
  • laravel/framework: 10.3.3

実装

handler を追加する

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

app/Logging/CustomRotatingFileHandler.php
<?php

namespace App\Logging;

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

class CustomRotatingFileHandler extends RotatingFileHandler
{
    public function __construct(string $filename, int $maxFiles = 0, $level = Level::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
use App\Logging\CustomRotatingFileHandler;
use Monolog\Formatter\LineFormatter;

        '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