Für einen HTTP-Anforderungslebenszyklus können Sie das Abfrageprotokoll in der handleMethode einiger BeforeAnyDbQueryMiddlewareMiddleware aktivieren und dann die ausgeführten Abfragen in der terminateMethode derselben Middleware abrufen .
classBeforeAnyDbQueryMiddleware{publicfunction handle($request,Closure $next){
DB::enableQueryLog();return $next($request);}publicfunction terminate($request, $response){// Store or dump the log data...
dd(
DB::getQueryLog());}}
Die Kette einer Middleware wird nicht für handwerkliche Befehle ausgeführt. Daher können Sie für die CLI-Ausführung das Abfrageprotokoll im artisan.startEreignis-Listener aktivieren .
Zum Beispiel können Sie es in die bootstrap/app.phpDatei einfügen
Laravel speichert alle Abfragen. In einigen Fällen, z. B. beim Einfügen einer großen Anzahl von Zeilen oder bei einem lang laufenden Job 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. In diesem Fall würde ich empfehlen, es nur für die Entwicklung zu aktivieren.
if(App::environment('local')){// The environment is local
DB::enableQueryLog();}
Wenn Ihr System mehr als eine Datenbankverbindung verwendet, müssen Sie diese angeben, andernfalls wird möglicherweise ein leeres Array zurückgegeben:\DB::connection('myconnection')->enableQueryLog(); print_r(\DB::connection('myconnection')->getQueryLog());
Diana R.
Veröffentlichen Sie Ihren Kommentar als Antwort @DianaR.
So aktivieren Sie die Protokollierung von Eloquent "NameController :: create ();" Aussage?
Rubén Ruíz
2
Beachten Sie, dass in Laravel 5.4 die DB::listenRückruffunktion eine andere Signatur hat. Es ist eher so: DB::listen(function($query) { $sql = $query->sql; $bindings = $query->bindings; $time = $query->time; ... });
racl101
45
Wenn Sie sich nur um die eigentliche Abfrage (die letzte Ausführung) für schnelle Debugging-Zwecke kümmern:
DB::enableQueryLog();# your laravel query builder goes here
$laQuery = DB::getQueryLog();
$lcWhatYouWant = $laQuery[0]['query'];# <-------# optionally disable the query log:
DB::disableQueryLog();
Führen Sie ein Ein print_r()aus $laQuery[0], um die vollständige Abfrage einschließlich der Bindungen abzurufen. (Bei der $lcWhatYouWantobigen Variablen werden die Variablen durch ersetzt. ??)
Wenn Sie etwas anderes als die Haupt-MySQL-Verbindung verwenden, müssen Sie stattdessen diese verwenden:
Wohin geht dieser Code? (5.4) Ich habe versucht, Controller, Modell und Middleware zu suchen, nicht sicher, wo ich es ausführen soll, bevor ich den DB-Fehler erhalte.
Blamb
Wenn beim Ausführen der Abfrage, die die Ausführung stoppt, eine Fehlermeldung angezeigt wird, sollte der Fehler das Problem anzeigen. Wenn Sie Fehler deaktiviert haben, können Sie das Fehlerprotokoll in / storage / log / laravel oder ähnliches überprüfen. (Ich bin momentan nicht an meinem Computer.) Wenn Sie sagen, dass beim Ausführen des in meiner Antwort vorgeschlagenen Codes eine Fehlermeldung angezeigt wird, stellen Sie sicher, dass Sie die DB-Fassade überall dort einschließen, wo Sie den Code ausführen. Sie sind sich nicht sicher, was Sie versuchen, aber der Controller scheint die korrekteste der von Ihnen genannten Optionen zu sein. (Ich führe normalerweise Abfragen in separaten Hilfsklassen aus)
Ein bisschen schmutzig, aber +1 für die $ query-> bindings und $ query-> time hints
Paolo Stefan
Ordentlich! Wenn Sie dies verwenden, werden die Ergebnisse in der Ansicht genau dort angezeigt, wo die Abfrage ausgeführt wird!
Charles Wood
14
Sie müssen zuerst die Abfrageprotokollierung aktivieren
DB::enableQueryLog();
Dann können Sie Abfrageprotokolle erhalten, indem Sie einfach:
dd(DB::getQueryLog());
Es ist besser, wenn Sie die Abfrageprotokollierung aktivieren, bevor die Anwendung gestartet wird. Dies können Sie in einer BeforeMiddleware tun und dann die ausgeführten Abfragen in AfterMiddleware abrufen.
Anscheinend DB::listenerhält der Abschluss in Laravel 5.2 nur einen einzigen Parameter.
Wenn Sie also DB::listenLaravel 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('\'Y-m-d 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('Y-m-d').'_query.log'),'a+');
fwrite($logFile, date('Y-m-d H:i:s').': '. $query . PHP_EOL);
fclose($logFile);});
useMonolog\Logger;useMonolog\Handler\StreamHandler;
$log =newLogger('sql');
$log->pushHandler(newStreamHandler(storage_path().'/logs/sql-'. date('Y-m-d').'.log',Logger::INFO));// add records to the log
$log->addInfo($query, $data);
Es ist eine schlechte Idee, vendorDateien zu bearbeiten . Sie müssen original aufbewahrt werden.
Shukshin.ivan
@ shukshin.ivan Ja, man darf keine Herstellerdateien bearbeiten, aber um die genaue Abfrage zu erhalten, haben wir diesen Code vorerst bearbeitet, dann können wir ihn zurück ändern.
Antworten:
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:
oder registrieren Sie einen Ereignis-Listener:
Einige Hinweise
1. Mehrere DB-Verbindungen
Wenn Sie mehr als eine DB-Verbindung haben, müssen Sie angeben, welche Verbindung protokolliert werden soll
So aktivieren Sie das Abfrageprotokoll für
my_connection
:So erhalten Sie ein Abfrageprotokoll für
my_connection
:2. Wo kann das Abfrageprotokoll aktiviert werden?
Für einen HTTP-Anforderungslebenszyklus können Sie das Abfrageprotokoll in der
handle
Methode einigerBeforeAnyDbQueryMiddleware
Middleware aktivieren und dann die ausgeführten Abfragen in derterminate
Methode derselben Middleware abrufen .Die Kette einer Middleware wird nicht für handwerkliche Befehle ausgeführt. Daher können Sie für die CLI-Ausführung das Abfrageprotokoll im
artisan.start
Ereignis-Listener aktivieren .Zum Beispiel können Sie es in die
bootstrap/app.php
Datei einfügen3. Speicher
Laravel speichert alle Abfragen. In einigen Fällen, z. B. beim Einfügen einer großen Anzahl von Zeilen oder bei einem lang laufenden Job 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. In diesem Fall würde ich empfehlen, es nur für die Entwicklung zu aktivieren.
Verweise
quelle
\DB::connection('myconnection')->enableQueryLog(); print_r(\DB::connection('myconnection')->getQueryLog());
DB::listen
Rückruffunktion eine andere Signatur hat. Es ist eher so:DB::listen(function($query) { $sql = $query->sql; $bindings = $query->bindings; $time = $query->time; ... });
Wenn Sie sich nur um die eigentliche Abfrage (die letzte Ausführung) für schnelle Debugging-Zwecke kümmern:
Führen Sie ein Ein
print_r()
aus$laQuery[0]
, um die vollständige Abfrage einschließlich der Bindungen abzurufen. (Bei der$lcWhatYouWant
obigen Variablen werden die Variablen durch ersetzt.??
)Wenn Sie etwas anderes als die Haupt-MySQL-Verbindung verwenden, müssen Sie stattdessen diese verwenden:
(mit Ihrem Verbindungsnamen, wobei "mysql2" ist)
quelle
Fügen Sie dies in die Datei route.php ein:
Eingereicht von msurguy, Quellcode auf dieser Seite . Diesen Fixcode für Laravel 5.2 finden Sie in den Kommentaren.
quelle
Sie müssen zuerst die Abfrageprotokollierung aktivieren
Dann können Sie Abfrageprotokolle erhalten, indem Sie einfach:
Es ist besser, wenn Sie die Abfrageprotokollierung aktivieren, bevor die Anwendung gestartet wird. Dies können Sie in einer BeforeMiddleware tun und dann die ausgeführten Abfragen in AfterMiddleware abrufen.
quelle
Anscheinend
DB::listen
erhält der Abschluss in Laravel 5.2 nur einen einzigen Parameter.Wenn Sie also
DB::listen
Laravel 5.2 verwenden möchten , sollten Sie Folgendes tun:quelle
Für Laravel 5.8 fügen Sie einfach dd oder dump hinzu .
Ex:
oder
Referenz: https://laravel.com/docs/5.8/queries#debugging
quelle
Verwenden Sie
toSql()
stattget()
wie folgt:quelle
(Laravel 5.2) Ich finde, der einfachste Weg ist, nur eine Codezeile hinzuzufügen, um die SQL-Abfragen zu überwachen:
quelle
In Fortsetzung von Anscheinend mit Laravel 5.2 erhält der Abschluss 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:
quelle
Dieser Code ist für:
Hier ist der Code, der auf der Antwort von @milz basiert:
Der Kern ist die
if(stripos...
Zeile, die die Rekursion des Einfügens derinsert into log
SQL-Anweisung in die Datenbank verhindert.quelle
Ich denke, die Antwort befindet sich in diesem Artikel: https://arjunphp.com/laravel-5-5-log-eloquent-queries/
ist schnell und einfach, um die Abfrageprotokollierung zu erreichen.
Sie müssen
AppServiceProvider
derboot
Methode nur einen Rückruf hinzufügen , um DB-Abfragen abzuhören:quelle
Angenommen, Sie möchten die SQL-Abfrage der folgenden Anweisungen drucken.
Sie müssen nur Folgendes tun:
Dadurch wird die zuletzt ausgeführte Abfrage in Laravel gedruckt.
quelle
Für Laravel 5 und höher reicht es nicht, nur DB :: getQueryLog () zu verwenden. Standardmäßig ist dies der Wert von
ändere es auf
in der folgenden Datei für die Protokollierungsabfrage.
Und dann können wir das verwenden,
DB::getQueryLog()
wo Sie die Abfrage drucken möchten.quelle
vendor
Dateien zu bearbeiten . Sie müssen original aufbewahrt werden.