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してみてください。