2016-12-15 73 views
8

我和我的團隊正在開展一個相當大的項目。有各種各樣的查詢 - 控制器,視圖中的作曲者(延遲加載)以及其他一些服務。目前很難記錄這一切,頁面加載速度目前相當緩慢。Laravel 5.3 - 如何記錄頁面上的所有查詢?

哪裏可以放\ DB :: enableQueryLog()和\ DB :: getQueryLog()來記錄所有查詢並轉儲它們?基本上我正在尋找代碼發生在任何查詢之前發生的地方(把enableQueryLog()),我正在尋找一個地方發生在視圖呈現(轉儲getQueryLog())之後。

這將是一個好方法嗎?

在此先感謝。

+0

可能是你可以在疼痛使用getQueryLog()方法 –

+0

的可能的複製一個單獨的表查詢[如何獲得在Laravel 5執行的查詢? DB :: getQueryLog返回空數組](http://stackoverflow.com/questions/27753868/how-to-get-the-query-executed-in-laravel-5-dbgetquerylog-returning-empty-arr) – Overdrivr

回答

14

這裏談到一個很好的例子:

https://laravel.com/docs/5.3/database#listening-for-query-events

打開應用程序\供應商\ AppServiceProvider。 php並將以下內容添加到Boot()功能:

DB::listen(function ($query) { 
    var_dump([ 
     $query->sql, 
     $query->bindings, 
     $query->time 
    ]); 
}); 
+0

從我的支持開始聽這些查詢,但我會在哪裏轉儲它們?我看到了另一個鏈接到可終止中間件的答案。所以一個好方法是在中間件中實現terminate()方法並將其轉儲到那裏? – devk

+1

你可以只是Log :: info($ query-> sql) –

+1

這麼多是的。在需要時易於實施。使用'\ Log :: debug('query',[...])'我能夠將所有內容記錄到laravel日誌中,並找到執行效率低下的查詢,而我可以在其中進行熱切加載。謝謝。 – Stoutie

0

添加請求完成後執行,並記錄您的查詢中間件...看Terminable Middlwares

+0

由此從請求完成時可終止的中間件被調用以來,查詢將完成。 – Mjh

5

您可以添加此向供應商/ AppServiceProvider.php文件,並與尾部檢查它們在laravel日誌文件:

tail -f storage/logs/laravel.log 

,你甚至可以用你想要日誌查詢過濾器。例如,在這裏我使用的是Laravel Passport,並不想記錄所有的oauth查詢。

use Illuminate\Support\Facades\App; 
use Illuminate\Support\Facades\Event; 
use Illuminate\Support\Facades\Log; 

public function register() { 
    if (App::environment('local') && env('APP_URL') == 'http://localhost') { 
     Event::listen('Illuminate\Database\Events\QueryExecuted', function ($query) { 
      // filter oauth ones 
      if (!str_contains($query->sql, 'oauth')) { 
       Log::debug($query->sql . ' - ' . serialize($query->bindings)); 
      } 
     }); 
    } 
} 
相關問題