LaravelのSQLを開発環境時のみログ出力する
はじめに
開発用ライブラリの『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
*/
public function boot()
{
//
// 開発環境以外の場合、SQLログを出力
if (!app()->isProduction()) {
$this->dataBaseQuery();
}
}
private function dataBaseQuery()
{
\DB::listen(function ($query): void {
$sql = $query->sql;
foreach ($query->bindings as $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 ($binding instanceof Carbon) {
$binding = "'{$binding->toDateTimeString()}'";
} elseif ($binding instanceof DateTime) {
$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\Providers\AppServiceProvider.php
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
//
// 開発環境以外の場合、SQLログを出力
if (!app()->isProduction()) {
$this->dataBaseQuery();
}
}
private function dataBaseQuery()
{
\DB::listen(function ($query): void {
$sql = $query->sql;
foreach ($query->bindings as $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 ($binding instanceof Carbon) {
$binding = "'{$binding->toDateTimeString()}'";
} elseif ($binding instanceof DateTime) {
$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
Author And Source
この問題について(LaravelのSQLを開発環境時のみログ出力する), 我々は、より多くの情報をここで見つけました https://qiita.com/suzuki_web/items/80f445235a2840053f0e著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .