Lumen 实时记录 SQL 执行解决方案
发现好多小伙伴调试代码时对sql 打印不方便,特整理怎么实时在日志文件中打印所执行的 sql 语句
1、在 Listeners
目录新建 QueryListener.php
文件 代码如下:
<?php
namespace App\Listeners;
use Illuminate\Database\Events\QueryExecuted;
class QueryListener
{
public function handle(QueryExecuted $event)
{
if (env('APP_ENV', 'production') == 'local') {
$sql = str_replace('?', "'%s'", $event->sql);
$log = vsprintf($sql, $event->bindings);
$this->put_log('sql', $log);
}
}
private function put_log($file = 'app', $content = '')
{
$data = date('Y-m-d');
$cut_line = str_repeat("-", 100);
is_dir(storage_path('logs/sql')) or mkdir (storage_path('logs/sql'), 0777, true); // 文件夹不存在则创建
$content = '[' . date('Y-m-d H:i:s') . "]" . $content;
@file_put_contents(storage_path('logs/sql/' . $file . '-' . $data . '.log'), $content . "\n" . $cut_line . "\n\n", FILE_APPEND);
}
}
2、在Providers/EventServiceProvider.php
添加如下代码
<?php
namespace App\Providers;
use Laravel\Lumen\Providers\EventServiceProvider as ServiceProvider;
class EventServiceProvider extends ServiceProvider
{
/**
* The event listener mappings for the application.
*
* @var array
*/
protected $listen = [
'Illuminate\Database\Events\QueryExecuted' => [
'App\Listeners\QueryListener'
],
];
}
3、在 bootstrap/app.php
文件中开启 EventServiceProvider
注册即可
$app->register(App\Providers\EventServiceProvider::class);
4、接下来写一个 sql 语句就能在 storage/logs/sql
看到生成的 sql
日志了
app('db')->where('id', '>', '5')->get();
希望能对大家有所帮助
本作品采用《CC 协议》,转载必须注明作者和本文链接