LoginSignup
10
9

More than 5 years have passed since last update.

実行するSQLのクエリーをlaravel.log以外に吐いてみた

Posted at

laravel.logに出すことなく別のLogに実行するSQLのクエリー出すという感じです。

やったこと

Illuminate/LogSqlの作成

まずはIllminate/Logをフォルダごとコピーして、LogSqlと名称を変更。

その後、LogSqlの中にあるLogServiceProvider.phpをLogSqlServiceProvider.phpに改名。
改名後、中身を以下のように変更。

<?php namespace Illuminate\LogSql;

use Monolog\Logger;
use Illuminate\Support\ServiceProvider;

class LogSqlServiceProvider extends ServiceProvider {

  /**
   * Indicates if loading of the provider is deferred.
   *
   * @var bool
   */
  protected $defer = true;

  /**
   * Register the service provider.
   *
   * @return void
   */
  public function register()
  {
    $logger = new Writer(
      new Logger($this->app['env']), $this->app['events']
    );

    $this->app->instance('logsql', $logger);

    // If the setup Closure has been bound in the container, we will resolve it
    // and pass in the logger instance. This allows this to defer all of the
    // logger class setup until the last possible second, improving speed.
    if (isset($this->app['logsql.setup']))
    {
      call_user_func($this->app['logsql.setup'], $logger);
    }
  }

  /**
   * Get the services provided by the provider.
   *
   * @return array
   */
  public function provides()
  {
    return array('logsql');
  }
}

次にWriter.phpのnamespaceも変更ー。

<?php namespace Illuminate\LogSql;

app/config/app.phpの変更

providersとaliasesを変更します

'providers' => array(
    'Illuminate\LogSql\LogSqlServiceProvider',
// 省略
'aliases' => array(
    'LogSql'            => 'Illuminate\Support\Facades\LogSql',
// 省略

Facadeの作成

続いて、Illuminate/Support/Facades/Log.phpをコピーしてIlluminate/Support/Facades/LogSql.phpを作成して中身を変更します。

<?php namespace Illuminate\Support\Facades;

/**
 * @see \Illuminate\LogSql\Writer
 */
class LogSql extends Facade {

  /** 
   * Get the registered name of the component.
   *
   * @return string
   */
  protected static function getFacadeAccessor() { return     'logsql'; }

}

あとは、app/start/global.phpでSQLのイベントをキャッチする仕組みとuseFilesを書けば終わりです。

LogSql::useFiles(storage_path().'/logs/laravel_sql.log');

Event::listen('illuminate.query', function($query, $bindings, $time, $name)
{
    $data = compact('bindings', 'time', 'name');
    foreach ($bindings as $i => $binding)
    {
        if($binding instanceof \DateTime)
        {
            $bindings[$i] = $binding->format('\'Y-m-d H:i:s\'');
        }elseif(is_string($binding)){
            $bindings[$i] = "'$binding'";
        }
    }
    $query = str_replace(array('%', '?'), array('%%', '%s'), $query);
    $query = vsprintf($query, $bindings);
    LogSql::info($query, $data);
});

もしエラーが出るという方はphp artisan clear-compiledしてみてください。

10
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
9