2016-12-15 2 views
8

Mein Team und ich arbeiten an einem ziemlich großen Projekt. Es gibt überall Anfragen - in Controllern, View-Composern in Views (Lazy Loading) und wahrscheinlich auch in einigen anderen Diensten. Es wird schwierig, den Überblick zu behalten, und die Seitenladegeschwindigkeit ist im Moment ziemlich langsam.Laravel 5.3 - Wie protokolliert man alle Abfragen auf einer Seite?

Wo würde ich \ DB :: enableQueryLog() und \ DB :: getQueryLog() alle Abfragen protokollieren und sie ablegen? Im Grunde suche ich nach einer Stelle im Code, die passiert, bevor irgendwelche der Abfragen passieren (um enableQueryLog() zu setzen), und ich suche nach einem Ort, der nach dem Rendern der Ansichten passiert (um getQueryLog() zu dumpen).

Was wäre ein guter Weg, dies zu tun?

Vielen Dank im Voraus.

+0

können Sie kann wund die Abfrage in einer separaten Tabelle mit getQueryLog() -Methode –

+0

Mögliches Duplikat von [Wie die Abfrage in Laravel 5 ausgeführt bekommen? DB :: getQueryLog gibt leeres Array zurück] (http://stackoverflow.com/questions/27753868/how-to-get-the-query-executed-in-laravel-5-dbgetquerylog-returning-empty-arr) – Overdrivr

Antwort

14

kommt das perfekte Beispiel:

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

öffnen app \ Providers \ AppServiceProvider. php und fügen Sie das folgende zu Boot() hinzu Funktion:

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

Von meinem Verständnis hört das auf die Abfragen zu hören, aber wo würde ich sie ablegen? Ich sehe die andere Antwort auf terminierbare Middleware verlinken. Ein guter Weg wäre also, die Methode terminate() in einer Middleware zu implementieren und dort zu speichern. – devk

+1

Sie können einfach Log :: info ($ query-> sql) –

+1

So viel ja. Bei Bedarf einfach zu implementieren. Mit '\ Log :: debug ('query', [...]) 'konnte ich alles in das Laravel-Log eintragen und ineffiziente Abfragen finden, die dort ausgeführt werden, wo ich stattdessen eifrig laden könnte. Vielen Dank. – Stoutie

0

eine Middleware hinzufügen, die die Anfrage ausführt, nachdem getan wird und protokolliert Ihre Fragen ... siehe Terminable Middlwares

+0

Dadurch Zeit, zu der die Abfragen beendet wären, da die terminierbare Middleware aufgerufen wird, wenn die Anfrage erledigt ist. – Mjh

5

Sie können diese Datei an den Provider/AppServiceProvider.php hinzufügen und sie in dem mit Schwanz Laravel Protokolldatei überprüfen:

tail -f storage/logs/laravel.log 

Sie können sogar mit Abfragen filtern Sie protokollieren möchten. Zum Beispiel habe ich hier Laravel Passport verwendet und wollte nicht alle OAUTH-Abfragen protokollieren.

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)); 
      } 
     }); 
    } 
} 
Verwandte Themen