はじめに
開発用ライブラリの『Laravel Debugbar』では、
APIやバッチ処理実行時のSQLが確認できないため、
開発時のみ発行しているSQLをログファイルに出力するようにする。
環境
PHP 7.4.9
Laravel Framework 8.25.0
SQLログ出力設定
app\Providers\AppServiceProvider.php
/**
* Bootstrap any application services.
*
* @return void
*/publicfunctionboot(){//// 開発環境以外の場合、SQLログを出力if(!app()->isProduction()){$this->dataBaseQuery();}}privatefunctiondataBaseQuery(){\DB::listen(function($query):void{$sql=$query->sql;foreach($query->bindingsas$binding){if(is_string($binding)){$binding="'{$binding}'";}elseif(is_bool($binding)){$binding=$binding?'1':'0';}elseif(is_int($binding)){$binding=(string)$binding;}elseif($binding===null){$binding='NULL';}elseif($bindinginstanceofCarbon){$binding="'{$binding->toDateTimeString()}'";}elseif($bindinginstanceofDateTime){$binding="'{$binding->format('Y-m-d H:i:s')}'";}$sql=preg_replace('/\\?/',$binding,$sql,1);}// SQL・queryTimeログ出力// \Log::debug('SQL', ['sql' => $sql, 'time' => "{$query->time} ms"]);// SQLログ出力\Log::debug($sql);});\Event::listen(TransactionBeginning::class,function(TransactionBeginning$event):void{\Log::debug('START TRANSACTION');});\Event::listen(TransactionCommitted::class,function(TransactionCommitted$event):void{\Log::debug('COMMIT');});\Event::listen(TransactionRolledBack::class,function(TransactionRolledBack$event):void{\Log::debug('ROLLBACK');});}
storage\logs\laravel.log
[2021-01-30 23:02:43] local.DEBUG: SELECT * FROM users
APP_ENV=local
本番環境は『APP_ENV=production』に変更するとSQLは出力されません。
参考記事
Laravel SQLの実行クエリログを出力する
https://qiita.com/ucan-lab/items/753cb9d3e4ceeb245341