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();

Tags: