Pour un cycle de vie de requête HTTP, vous pouvez activer le journal des requêtes dans la handleméthode de certains BeforeAnyDbQueryMiddlewaremiddleware , puis récupérer les requêtes exécutées dans la terminateméthode du même middleware.
classBeforeAnyDbQueryMiddleware{publicfunction handle($request,Closure $next){
DB::enableQueryLog();return $next($request);}publicfunction terminate($request, $response){// Store or dump the log data...
dd(
DB::getQueryLog());}}
La chaîne d'un middleware ne fonctionnera pas pour les commandes artisanales, vous pouvez donc activer le journal des requêtes dans l' artisan.startécouteur d'événements pour l'exécution de la CLI .
Par exemple, vous pouvez le mettre dans le bootstrap/app.phpfichier
Laravel garde toutes les requêtes en mémoire. Ainsi, dans certains cas, comme lors de l'insertion d'un grand nombre de lignes ou lors d'un travail de longue durée avec beaucoup de requêtes, cela peut amener l'application à utiliser un excès de mémoire.
Dans la plupart des cas, vous n'aurez besoin du journal des requêtes que pour le débogage, et si tel est le cas, je vous recommande de l'activer uniquement pour le développement.
if(App::environment('local')){// The environment is local
DB::enableQueryLog();}
Si votre système utilise plus d'une connexion db, vous devez le spécifier, sinon il pourrait renvoyer un tableau vide:\DB::connection('myconnection')->enableQueryLog(); print_r(\DB::connection('myconnection')->getQueryLog());
Diana R.
Postez votre commentaire en tant que réponse @DianaR.
Comment l'activer pour enregistrer Eloquent "NameController :: create ();" déclaration?
Rubén Ruíz
2
Notez que dans Laravel 5.4, la DB::listenfonction de rappel a une signature différente. C'est plus comme ça: DB::listen(function($query) { $sql = $query->sql; $bindings = $query->bindings; $time = $query->time; ... });
racl101
45
Si tout ce qui vous importe vraiment, c'est la requête réelle (la dernière exécution) à des fins de débogage rapide:
DB::enableQueryLog();# your laravel query builder goes here
$laQuery = DB::getQueryLog();
$lcWhatYouWant = $laQuery[0]['query'];# <-------# optionally disable the query log:
DB::disableQueryLog();
faites un print_r()on $laQuery[0]pour obtenir la requête complète, y compris les liaisons. (la $lcWhatYouWantvariable ci-dessus aura les variables remplacées par ??)
Si vous utilisez autre chose que la connexion principale mysql, vous devrez les utiliser à la place:
où va ce code? (5.4) J'ai essayé le contrôleur, le modèle et j'ai regardé dans le middleware, je ne sais pas où l'exécuter avant d'obtenir l'erreur db.
blamb
Si vous obtenez une erreur lors de l'exécution de la requête qui arrête l'exécution, l'erreur devrait vous indiquer le problème. Si les erreurs sont désactivées, vous pouvez consulter le journal des erreurs dans / storage / log / laravel ou quelque chose comme ça. (Je ne suis pas sur mon ordinateur pour le moment) Si vous dites que vous obtenez une erreur lors de l'exécution du code que j'ai suggéré dans ma réponse, assurez-vous d'inclure la façade DB partout où vous exécutez le code. Je ne sais pas ce que vous essayez de faire, mais le contrôleur sonne comme la plus correcte des options que vous avez mentionnées. (J'exécute généralement des requêtes dans des classes d'aide séparées)
Skeets
15
Vous devez d'abord activer la journalisation des requêtes
DB::enableQueryLog();
Ensuite, vous pouvez obtenir des journaux de requêtes simplement:
dd(DB::getQueryLog());
Il serait préférable d'activer la journalisation des requêtes avant le démarrage de l'application, ce que vous pouvez faire dans un BeforeMiddleware, puis récupérer les requêtes exécutées dans AfterMiddleware.
Un peu sale, mais +1 pour les $ query-> bindings et $ query-> time hints
Paolo Stefan
Soigné! L'utilisation de ceci montre les résultats dans la vue, là où la requête se produit!
Charles Wood
11
Apparemment avec Laravel 5.2, la fermeture DB::listenne reçoit qu'un seul paramètre.
Donc, si vous souhaitez utiliser DB::listenLaravel 5.2, vous devez faire quelque chose comme:
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);
C'est une mauvaise idée d'éditer des vendorfichiers. Ils doivent être conservés d'origine.
shukshin.ivan
@ shukshin.ivan Oui, il ne faut pas éditer les fichiers du fournisseur mais pour obtenir la requête exacte que nous avons édité ce code pour le moment, nous pouvons le modifier.
Réponses:
Par défaut, le journal des requêtes est désactivé dans Laravel 5: https://github.com/laravel/framework/commit/e0abfe5c49d225567cb4dfd56df9ef05cc297448
Vous devrez activer le journal des requêtes en appelant:
ou enregistrez un écouteur d'événements:
Quelques conseils
1. Connexions DB multiples
Si vous disposez de plusieurs connexions DB, vous devez spécifier la connexion à enregistrer
Pour activer le journal des requêtes pour
my_connection
:Pour obtenir le journal des requêtes pour
my_connection
:2. Où activer le journal des requêtes?
Pour un cycle de vie de requête HTTP, vous pouvez activer le journal des requêtes dans la
handle
méthode de certainsBeforeAnyDbQueryMiddleware
middleware , puis récupérer les requêtes exécutées dans laterminate
méthode du même middleware.La chaîne d'un middleware ne fonctionnera pas pour les commandes artisanales, vous pouvez donc activer le journal des requêtes dans l'
artisan.start
écouteur d'événements pour l'exécution de la CLI .Par exemple, vous pouvez le mettre dans le
bootstrap/app.php
fichier3. Mémoire
Laravel garde toutes les requêtes en mémoire. Ainsi, dans certains cas, comme lors de l'insertion d'un grand nombre de lignes ou lors d'un travail de longue durée avec beaucoup de requêtes, cela peut amener l'application à utiliser un excès de mémoire.
Dans la plupart des cas, vous n'aurez besoin du journal des requêtes que pour le débogage, et si tel est le cas, je vous recommande de l'activer uniquement pour le développement.
Références
la source
\DB::connection('myconnection')->enableQueryLog(); print_r(\DB::connection('myconnection')->getQueryLog());
DB::listen
fonction de rappel a une signature différente. C'est plus comme ça:DB::listen(function($query) { $sql = $query->sql; $bindings = $query->bindings; $time = $query->time; ... });
Si tout ce qui vous importe vraiment, c'est la requête réelle (la dernière exécution) à des fins de débogage rapide:
faites un
print_r()
on$laQuery[0]
pour obtenir la requête complète, y compris les liaisons. (la$lcWhatYouWant
variable ci-dessus aura les variables remplacées par??
)Si vous utilisez autre chose que la connexion principale mysql, vous devrez les utiliser à la place:
(avec votre nom de connexion où "mysql2" est)
la source
Vous devez d'abord activer la journalisation des requêtes
Ensuite, vous pouvez obtenir des journaux de requêtes simplement:
Il serait préférable d'activer la journalisation des requêtes avant le démarrage de l'application, ce que vous pouvez faire dans un BeforeMiddleware, puis récupérer les requêtes exécutées dans AfterMiddleware.
la source
Mettez ceci sur le fichier routes.php:
Soumis par msurguy, code source dans cette page . Vous trouverez ce code de correctif pour laravel 5.2 dans les commentaires.
la source
Apparemment avec Laravel 5.2, la fermeture
DB::listen
ne reçoit qu'un seul paramètre.Donc, si vous souhaitez utiliser
DB::listen
Laravel 5.2, vous devez faire quelque chose comme:la source
Pour laravel 5.8, ajoutez simplement dd ou dump .
Ex:
ou
référence: https://laravel.com/docs/5.8/queries#debugging
la source
Utilisez
toSql()
plutôt queget()
comme ça:la source
(Laravel 5.2) Je trouve que le moyen le plus simple est simplement d'ajouter une ligne de code pour surveiller les requêtes SQL:
la source
En continuant de Apparemment avec Laravel 5.2, la fermeture dans DB :: listen ne reçoit qu'un seul paramètre ... réponse ci-dessus: vous pouvez mettre ce code dans le script Middleware et l'utiliser dans les routes.
Aditionellement:
la source
Ce code est pour:
Voici le code, basé sur la réponse de @milz:
Le noyau est la
if(stripos...
ligne, qui empêche la récursivité de l'insertion de l'insert into log
instruction sql dans la base de données.la source
Je pense que la réponse se trouve dans cet article: https://arjunphp.com/laravel-5-5-log-eloquent-queries/
est rapide et simple à réaliser la journalisation des requêtes.
Il suffit d'ajouter à
AppServiceProvider
laboot
méthode un rappel pour écouter les requêtes DB:la source
Supposons que vous souhaitiez imprimer la requête SQL des instructions suivantes.
Il vous suffit de procéder comme suit:
Cela imprimera la dernière requête exécutée dans Laravel.
la source
Pour laravel 5 et les versions ultérieures en utilisant uniquement DB :: getQueryLog (), cela ne fonctionnera pas. Par défaut, la valeur de
changez-le en
dans le fichier ci-dessous pour la requête de journalisation.
Et puis nous pouvons utiliser l'
DB::getQueryLog()
endroit où vous souhaitez imprimer la requête.la source
vendor
fichiers. Ils doivent être conservés d'origine.