shinke1987.net
雑多な備忘録等のはず。
他のカテゴリ・タブ
目次
PR

QueryExceptionの内容のみ特定のログファイルに記録

2024-02-25 2024-06-06

目的

SQL関連のエラーだけ特定のログファイルに記録されるようにしたい。

手順

  1. config/logging.php の編集
  2. app/Exceptions/Handler.php の編集(Laravel10の場合)
    bootstrap/app.php の編集(Laravel11の場合)
  3. 動作確認

config/logging.php

singleチャンネルの下にでも追加する。

'sql_error' => [
            'driver' => 'daily',
            'path' => storage_path('logs/QueryException/sql_error.log'),
            'level' => 'error',
            'days' => 365,
            'replace_placeholders' => true,
        ],

replace_placeholdersについては、次のページが参考になる。

https://github.com/laravel/laravel/pull/6139

app/Exceptions/Handler.php(Laravel10の場合)

下記のように追加する。

public function register(): void
    {
        $this->reportable(function (Throwable $e) {
            //
        });

        $this->reportable(function (QueryException $e) {
            Log::channel('sql_error')->error($e->getMessage());
            Log::channel('sql_error')->error($e->getSql());
            Log::channel('sql_error')->error($e->getBindings());
        });
    }

bootstrap/app.php(Laravel11の場合)

<?php

use Illuminate\Database\QueryException;
use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;
use Illuminate\Support\Facades\Log;

return Application::configure(basePath: dirname(__DIR__))
    ->withRouting(
        web: __DIR__.'/../routes/web.php',
        commands: __DIR__.'/../routes/console.php',
        health: '/up',
    )
    ->withMiddleware(function (Middleware $middleware) {
        //
    })
    ->withExceptions(function (Exceptions $exceptions) {
        $exceptions->report(function (QueryException $e) {
            Log::channel('sql_error')->error($e->getMessage());
            Log::channel('sql_error')->error($e->getSql());
            Log::channel('sql_error')->error($e->getBindings());
        });
    })->create();

動作確認

何らかのコントローラで、次のエラーが出るコードを実行し、
storage/logsフォルダに作成される「sql_error-YYYY-MM-DD.log」というファイルを確認すれば良い。

DB::table('aiueo')->get();
同一カテゴリの記事