Laravel框架自定义SQL日志记录
- 2019 年 10 月 10 日
- 笔记
发现好多小伙伴调试代码时对 sql 打印不方便,特整理怎么实时在日志文件中打印所执行的 sql 语句
1、在 Listeners
目录新建 QueryListener.php
文件 代码如下:
<?php namespace AppListeners; use IlluminateDatabaseEventsQueryExecuted; 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 . "nn", FILE_APPEND); } }
2、在 Providers/EventServiceProvider.php
添加如下代码
<?php namespace AppProviders; use LaravelLumenProvidersEventServiceProvider as ServiceProvider; class EventServiceProvider extends ServiceProvider { /** * The event listener mappings for the application. * * @var array */ protected $listen = [ 'IlluminateDatabaseEventsQueryExecuted' => [ 'AppListenersQueryListener' ], ]; }
3、在 bootstrap/app.php
文件中开启 EventServiceProvider
注册即可
$app->register(AppProvidersEventServiceProvider::class);
4、接下来写一个 sql 语句就能在 storage/logs/sql
看到生成的 sql
日志了
app('db')->where('id', '>', '5')->get();