Wie bekomme ich die Abfrage in Laravel 5? DB :: getQueryLog gibt ein leeres Array zurück

Ich versuche, das Protokoll für eine Abfrage DB::getQueryLog() , aber DB::getQueryLog() gibt nur einen leeren Array zurück:

 $user = User::find(5); print_r(DB::getQueryLog()); 

Ergebnis:

 Array ( ) 

Wie kann ich das Protokoll für diese Abfrage anzeigen?

Standardmäßig ist das Abfrageprotokoll in Laravel 5 deaktiviert: https://github.com/laravel/framework/commit/e0abfe5c49d225567cb4dfd56df9ef05cc297448

Sie müssen das Abfrageprotokoll aktivieren, indem Sie Folgendes aufrufen:

 DB::enableQueryLog(); 

oder registrieren Sie einen Ereignis-Listener:

 DB::listen( function ($sql, $bindings, $time) { // $sql - select * from `ncv_users` where `ncv_users`.`id` = ? limit 1 // $bindings - [5] // $time(in milliseconds) - 0.38 } ); 

Einige Hinweise

1. Mehrere DB-Verbindungen

Wenn Sie mehr als eine DB-Verbindung haben, müssen Sie angeben, welche Verbindung protokolliert werden soll

So my_connection das Abfrageprotokoll für my_connection :

 DB::connection('my_connection')->enableQueryLog(); 

So my_connection Sie das Abfrageprotokoll für my_connection :

 print_r( DB::connection('my_connection')->getQueryLog() ); 

2. Wo Abfrageprotokoll aktivieren?

Für einen HTTP-Anforderungslebenszyklus können Sie das Abfrageprotokoll in der handle Methode einer Middleware von BeforeAnyDbQueryMiddleware und anschließend die ausgeführten Abfragen in der terminate derselben Middleware abrufen.

 class BeforeAnyDbQueryMiddleware { public function handle($request, Closure $next) { DB::enableQueryLog(); return $next($request); } public function terminate($request, $response) { // Store or dump the log data... dd( DB::getQueryLog() ); } } 

Die Middlewarekette wird nicht für Handwerkerbefehle ausgeführt. artisan.start können Sie für die CLI-Ausführung das Abfrageprotokoll im artisan.start Ereignis-Listener artisan.start .

Zum Beispiel können Sie es in die bootstrap/app.php Datei bootstrap/app.php

 $app['events']->listen('artisan.start', function(){ \DB::enableQueryLog(); }); 

3. Speicher

Laravel behält alle Abfragen im Speicher. In einigen Fällen, z. B. beim Einfügen einer großen Anzahl von Zeilen oder bei einem Job mit langer Ausführungszeit mit vielen Abfragen, kann dies dazu führen, dass die Anwendung überschüssigen Speicher verwendet.

In den meisten Fällen benötigen Sie das Abfrageprotokoll nur zum Debuggen, und wenn dies der Fall ist, würde ich empfehlen, es nur für die Entwicklung zu aktivieren.

 if (App::environment('local')) { // The environment is local DB::enableQueryLog(); } 

Verweise

Wenn Sie nur die eigentliche Abfrage (den letzten Lauf) für schnelle Debugging-Zwecke interessieren:

 DB::enableQueryLog(); # your laravel query builder goes here $laQuery = DB::getQueryLog(); $lcWhatYouWant = $laQuery[0]['query']; # < ------- # optionally disable the query log: DB::disableQueryLog(); 

print_r() Sie print_r() in $laQuery[0] , um die vollständige Abfrage einschließlich der Bindungen zu erhalten. (Die $lcWhatYouWant Variable oben wird die Variablen durch ?? )

Wenn Sie etwas anderes als die Haupt-MySQL-Verbindung verwenden, müssen Sie stattdessen diese verwenden:

DB::connection("mysql2")->enableQueryLog();

DB::connection("mysql2")->getQueryLog();

(mit Ihrem Verbindungsnamen wo "mysql2" ist)

Offenbar erhält mit Laravel 5.2 die Schließung in DB::listen nur einen einzigen Parameter.

Wenn Sie also DB::listen in Laravel 5.2 verwenden möchten, sollten Sie Folgendes tun:

 DB::listen( function ($sql) { // $sql is an object with the properties: // sql: The query // bindings: the sql query variables // time: The execution time for the query // connectionName: The name of the connection // To save the executed queries to file: // Process the sql and the bindings: foreach ($sql->bindings as $i => $binding) { if ($binding instanceof \DateTime) { $sql->bindings[$i] = $binding->format('\'Ymd H:i:s\''); } else { if (is_string($binding)) { $sql->bindings[$i] = "'$binding'"; } } } // Insert bindings into query $query = str_replace(array('%', '?'), array('%%', '%s'), $sql->sql); $query = vsprintf($query, $sql->bindings); // Save the query to file $logFile = fopen( storage_path('logs' . DIRECTORY_SEPARATOR . date('Ym-d') . '_query.log'), 'a+' ); fwrite($logFile, date('Ymd H:i:s') . ': ' . $query . PHP_EOL); fclose($logFile); } ); 

Sie müssen zuerst die Abfrageprotokollierung aktivieren

DB::enableQueryLog();

Es wäre besser, wenn Sie die Abfrageprotokollierung vor dem Start der Anwendung aktivieren. Dies können Sie in einer Before Middleware tun und dann die ausgeführten Abfragen in AfterMiddleware abrufen.

Setzen Sie dies auf die Datei routes.php:

 \Event::listen('Illuminate\Database\Events\QueryExecuted', function ($query) { echo'
'; var_dump($query->sql); var_dump($query->bindings); var_dump($query->time); echo'

'; });

Eingereicht von msurguy, Quelltext auf dieser Seite . Sie finden diesen Fix-Code für Laravel 5.2 in Kommentaren.

Dieser Code ist für:

  • Laravel 5.2
  • Protokollieren Sie die statementen in der mysql-database

Hier ist der Code, der auf @milz ‘Antwort basiert:

  DB::listen(function($sql) { $LOG_TABLE_NAME = 'log'; foreach ($sql->bindings as $i => $binding) { if ($binding instanceof \DateTime) { $sql->bindings[$i] = $binding->format('\'Ymd H:i:s\''); } else { if (is_string($binding)) { $sql->bindings[$i] = "'$binding'"; } } } // Insert bindings into query $query = str_replace(array('%', '?'), array('%%', '%s'), $sql->sql); $query = vsprintf($query, $sql->bindings); if(stripos($query, 'insert into `'.$LOG_TABLE_NAME.'`')===false){ $toLog = new LogModel(); $toLog->uId = 100; $toLog->sql = $query; $toLog->save(); } }); 

Der core ist die Zeile if(stripos... ), die die Rekursion verhindert, die Einfügung insert into log sql-statement logg in die database insert into log .

Bei der Fortsetzung von Anscheinend mit Laravel 5.2 erhält die Schließung in DB :: listen nur einen einzigen Parameter … Antwort oben: Sie können diesen Code in das Middleware-Skript einfügen und in den Routen verwenden.

Zusätzlich:

 use Monolog\Logger; use Monolog\Handler\StreamHandler; $log = new Logger('sql'); $log->pushHandler(new StreamHandler(storage_path().'/logs/sql-' . date('Ym-d') . '.log', Logger::INFO)); // add records to the log $log->addInfo($query, $data); 

(Laravel 5.2) Ich finde den einfachsten Weg ist nur eine Codezeile hinzuzufügen, um die SQL-Abfragen zu überwachen: \DB::listen(function($sql) {var_dump($sql); });

Für Laravel 5 und höher mit nur DB :: getQueryLog (), nicht tun. Standardmäßig ist dies der Wert von

  protected $loggingQueries = false; 

ändere es zu

 protected $loggingQueries = true; 

in der folgenden Datei für die Protokollierung der Abfrage. /vendor/laravel/framework/src/illuminate/Database/Connection.php Und dann können wir die DB :: getQueryLog () verwenden, wo Sie die Abfrage drucken möchten.