라라벨 5 eloquent orm query log 남기기


laravel 5.1 부터는 엘로퀀트 ORM 의 쿼리 로그를 보려고 DB::getQueryLog() 호출해도 SQL Query log 가 남지 않음.


방법 1. Event 등록  

다음 코드를 app/Provides/AppServiceProvider.php 에 추가

app/Provides/AppServiceProvider.php
public function register()
{
    if ($this->app->environment() !== 'production') {
    	\Event::listen('Illuminate\Database\Events\QueryExecuted', function ($query) {
        	\Log::info([
            'sql' => $query->sql,
            'bindings' => $query->bindings,
            'time' => $query->time,
	        ]);
    	});
	}
}


일반 로그와 섞여서 보기가 불편하면 Log channel 기능을 사용하여 sql log file 을 분리

config/logging.php
'channels' => [
  'sql' => [
    'driver' => 'daily',
    'path' => storage_path('logs/sql.log'),
    'level' => 'debug',
    'days' => 14,
  ],
app/Provides/AppServiceProvider.php
public function register()
{
    if ($this->app->environment() !== 'production') {
    	\Event::listen('Illuminate\Database\Events\QueryExecuted', function ($query) {
        	\Log::channel('sql')->info([
            'sql' => $query->sql,
            'bindings' => $query->bindings,
            'time' => $query->time,
	        ]);
    	});
	}
}

방법 2. laravel-sql-logger 패키지 사용

https://github.com/mnabialek/laravel-sql-logger 를 설치하여 SQL logging.

  1. 패키지 설치

    composer require mnabialek/laravel-sql-logger
  2. config/app.php 의 providers 등록

    Mnabialek\LaravelSqlLogger\Providers\ServiceProvider::class,
  3. publishing

    php artisan vendor:publish --provider="Mnabialek\LaravelSqlLogger\Providers\ServiceProvider"
  4. config/sql_logger.php 설정 
  5. 또는 .env 에 동작 설정

    SQL_LOG_QUERIES=true
    SQL_LOG_SLOW_QUERIES=true
    SQL_SLOW_QUERIES_MIN_EXEC_TIME=100
    SQL_LOG_OVERRIDE=false
    SQL_LOG_DIRECTORY=logs/sql
    SQL_CONVERT_TIME_TO_SECONDS=false
    SQL_LOG_SEPARATE_ARTISAN=false


Ref