目的
SQL関連のエラーだけ特定のログファイルに記録されるようにしたい。
手順
- config/logging.php の編集
- app/Exceptions/Handler.php の編集(Laravel10の場合)
bootstrap/app.php の編集(Laravel11の場合) - 動作確認
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();