W przypadku cyklu życia żądania HTTP można włączyć dziennik zapytań w handlemetodzie niektórych BeforeAnyDbQueryMiddlewareoprogramowania pośredniego, a następnie pobrać wykonane zapytania w terminatemetodzie tego samego oprogramowania pośredniego.
classBeforeAnyDbQueryMiddleware{publicfunction handle($request,Closure $next){
DB::enableQueryLog();return $next($request);}publicfunction terminate($request, $response){// Store or dump the log data...
dd(
DB::getQueryLog());}}
Łańcuch oprogramowania pośredniego nie będzie działał dla poleceń rzemieślniczych, więc w celu wykonania interfejsu wiersza polecenia można włączyć dziennik zapytań w artisan.startnasłuchiwaniu zdarzeń.
Na przykład możesz umieścić go w bootstrap/app.phppliku
Laravel przechowuje wszystkie zapytania w pamięci. Dlatego w niektórych przypadkach, na przykład podczas wstawiania dużej liczby wierszy lub w przypadku długotrwałego zadania z dużą liczbą zapytań, może to spowodować, że aplikacja zużyje nadmiar pamięci.
W większości przypadków będziesz potrzebować dziennika zapytań tylko do debugowania, a jeśli tak jest, zalecałbym włączenie go tylko do programowania.
if(App::environment('local')){// The environment is local
DB::enableQueryLog();}
Jeśli twój system używa więcej niż jednego połączenia db, musisz je określić, w przeciwnym razie może zwrócić pustą tablicę:\DB::connection('myconnection')->enableQueryLog(); print_r(\DB::connection('myconnection')->getQueryLog());
Diana R.
Opublikuj swój komentarz jako swoją odpowiedź @DianaR.
Jak włączyć rejestrowanie Eloquent "NameController :: create ();" komunikat?
Rubén Ruíz
2
Zauważ, że w Laravel 5.4 DB::listenfunkcja zwrotna ma inną sygnaturę. To bardziej tak: DB::listen(function($query) { $sql = $query->sql; $bindings = $query->bindings; $time = $query->time; ... });
racl101
45
Jeśli wszystko, na czym naprawdę Ci zależy, to faktyczne zapytanie (ostatnie uruchomione) w celu szybkiego debugowania:
DB::enableQueryLog();# your laravel query builder goes here
$laQuery = DB::getQueryLog();
$lcWhatYouWant = $laQuery[0]['query'];# <-------# optionally disable the query log:
DB::disableQueryLog();
zrobić print_r()ON $laQuery[0], aby uzyskać pełny zapytanie, włącznie z wiązaniami. ( $lcWhatYouWantzmienna powyżej będzie miała zmienne zastąpione przez ??)
Jeśli używasz czegoś innego niż główne połączenie mysql, musisz zamiast tego użyć tych:
gdzie jednak ten kod idzie? (5.4) Wypróbowałem kontroler, model i zajrzałem do oprogramowania pośredniego, nie byłem pewien, gdzie go wykonać, zanim pojawi się błąd db.
blamb
Jeśli podczas wykonywania kwerendy zatrzymującej wykonywanie pojawia się błąd, powinien on powiedzieć, na czym polega problem. Jeśli masz wyłączone błędy, możesz sprawdzić logowanie błędów / storage / log / laravel lub coś w tym rodzaju. (W tej chwili nie ma mnie przy komputerze) Jeśli mówisz, że pojawia się błąd podczas wykonywania kodu, który zasugerowałem w mojej odpowiedzi, upewnij się, że uwzględniasz fasadę DB wszędzie tam, gdzie uruchamiasz kod. Nie jestem pewien, co próbujesz zrobić, ale kontroler brzmi jak najbardziej poprawna z wymienionych opcji. (Zwykle wykonuję zapytania w osobnych klasach pomocniczych)
Trochę brudne, ale +1 dla $ query-> bindings i $ query-> time hints
Paolo Stefan
Schludny! Użycie tego pokazuje wyniki w widoku, dokładnie tam, gdzie występuje zapytanie!
Charles Wood
14
Najpierw musisz włączyć rejestrowanie zapytań
DB::enableQueryLog();
Następnie możesz uzyskać dzienniki zapytań, po prostu:
dd(DB::getQueryLog());
Byłoby lepiej, gdybyś włączył rejestrowanie zapytań przed uruchomieniem aplikacji, co możesz zrobić w programie BeforeMiddleware, a następnie pobrać wykonane zapytania w AfterMiddleware.
Najwyraźniej w przypadku Laravel 5.2 zamknięcie DB::listenotrzymuje tylko jeden parametr.
Tak więc, jeśli chcesz używać DB::listenw Laravel 5.2, powinieneś zrobić coś takiego:
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);
Odpowiedzi:
Domyślnie dziennik zapytań jest wyłączony w Laravel 5: https://github.com/laravel/framework/commit/e0abfe5c49d225567cb4dfd56df9ef05cc297448
Będziesz musiał włączyć dziennik zapytań, dzwoniąc:
lub zarejestruj odbiornik zdarzeń:
Kilka porad
1. Wiele połączeń DB
Jeśli masz więcej niż jedno połączenie DB, musisz określić, które połączenie ma być rejestrowane
Aby włączyć dziennik zapytań dla
my_connection
:Aby uzyskać dziennik zapytań dla
my_connection
:2. Gdzie włączyć dziennik zapytań?
W przypadku cyklu życia żądania HTTP można włączyć dziennik zapytań w
handle
metodzie niektórychBeforeAnyDbQueryMiddleware
oprogramowania pośredniego, a następnie pobrać wykonane zapytania wterminate
metodzie tego samego oprogramowania pośredniego.Łańcuch oprogramowania pośredniego nie będzie działał dla poleceń rzemieślniczych, więc w celu wykonania interfejsu wiersza polecenia można włączyć dziennik zapytań w
artisan.start
nasłuchiwaniu zdarzeń.Na przykład możesz umieścić go w
bootstrap/app.php
pliku3. Pamięć
Laravel przechowuje wszystkie zapytania w pamięci. Dlatego w niektórych przypadkach, na przykład podczas wstawiania dużej liczby wierszy lub w przypadku długotrwałego zadania z dużą liczbą zapytań, może to spowodować, że aplikacja zużyje nadmiar pamięci.
W większości przypadków będziesz potrzebować dziennika zapytań tylko do debugowania, a jeśli tak jest, zalecałbym włączenie go tylko do programowania.
Bibliografia
źródło
\DB::connection('myconnection')->enableQueryLog(); print_r(\DB::connection('myconnection')->getQueryLog());
DB::listen
funkcja zwrotna ma inną sygnaturę. To bardziej tak:DB::listen(function($query) { $sql = $query->sql; $bindings = $query->bindings; $time = $query->time; ... });
Jeśli wszystko, na czym naprawdę Ci zależy, to faktyczne zapytanie (ostatnie uruchomione) w celu szybkiego debugowania:
zrobić
print_r()
ON$laQuery[0]
, aby uzyskać pełny zapytanie, włącznie z wiązaniami. ($lcWhatYouWant
zmienna powyżej będzie miała zmienne zastąpione przez??
)Jeśli używasz czegoś innego niż główne połączenie mysql, musisz zamiast tego użyć tych:
(z nazwą połączenia, gdzie „mysql2” to)
źródło
Umieść to w pliku tours.php:
Przesłane przez msurguy, kod źródłowy na tej stronie . Ten kod poprawki dla programu Laravel 5.2 można znaleźć w komentarzach.
źródło
Najpierw musisz włączyć rejestrowanie zapytań
Następnie możesz uzyskać dzienniki zapytań, po prostu:
Byłoby lepiej, gdybyś włączył rejestrowanie zapytań przed uruchomieniem aplikacji, co możesz zrobić w programie BeforeMiddleware, a następnie pobrać wykonane zapytania w AfterMiddleware.
źródło
Najwyraźniej w przypadku Laravel 5.2 zamknięcie
DB::listen
otrzymuje tylko jeden parametr.Tak więc, jeśli chcesz używać
DB::listen
w Laravel 5.2, powinieneś zrobić coś takiego:źródło
W przypadku laravel 5.8 wystarczy dodać dd lub dump .
Dawny:
lub
odniesienie: https://laravel.com/docs/5.8/queries#debugging
źródło
Użyj
toSql()
zamiastget()
tak:źródło
(Laravel 5.2) Najprostszym sposobem jest dodanie jednej linii kodu w celu monitorowania zapytań sql:
źródło
Kontynuując działanie Apparently with Laravel 5.2, zamknięcie w DB :: Listen odbiera tylko jeden parametr ... odpowiedź powyżej: możesz umieścić ten kod w skrypcie oprogramowania pośredniego i używać go w trasach.
Do tego:
źródło
Ten kod jest przeznaczony dla:
Oto kod, który jest oparty na odpowiedzi @milz:
Rdzeniem jest
if(stripos...
linia, która zapobiega rekursji podczas wstawiania instrukcjiinsert into log
sql do bazy danych.źródło
Myślę, że odpowiedź znajduje się w tym artykule: https://arjunphp.com/laravel-5-5-log-eloquent-queries/
jest szybki i prosty w rejestrowaniu zapytań.
Wystarczy dodać
AppServiceProvider
wboot
metodzie wywołanie zwrotne, aby nasłuchiwać zapytań DB:źródło
Załóżmy, że chcesz wydrukować zapytanie SQL zawierające następujące instrukcje.
Wystarczy wykonać następujące czynności:
Spowoduje to wydrukowanie ostatniego wykonanego zapytania w Laravel.
źródło
Dla laravel 5 i nowszych, użycie tylko DB :: getQueryLog (), nie zadziała. BY domyślnie w tym wartość
zmień to na
w poniższym pliku do logowania zapytania.
Następnie możemy użyć miejsca, w
DB::getQueryLog()
którym chcesz wydrukować zapytanie.źródło
vendor
plików to zły pomysł . Muszą być oryginalne.