Ich versuche, das Protokoll für eine Abfrage anzuzeigen, gebe aber DB::getQueryLog()
nur ein leeres Array zurück:
$user = User::find(5);
print_r(DB::getQueryLog());
Ergebnis
Array
(
)
Wie kann ich das Protokoll für diese Abfrage anzeigen?
Ich versuche, das Protokoll für eine Abfrage anzuzeigen, gebe aber DB::getQueryLog()
nur ein leeres Array zurück:
$user = User::find(5);
print_r(DB::getQueryLog());
Ergebnis
Array
(
)
Wie kann ich das Protokoll für diese Abfrage anzeigen?
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:
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
}
);
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
:
DB::connection('my_connection')->enableQueryLog();
So erhalten Sie ein Abfrageprotokoll für my_connection
:
print_r(
DB::connection('my_connection')->getQueryLog()
);
Für einen HTTP-Anforderungslebenszyklus können Sie das Abfrageprotokoll in der handle
Methode einiger BeforeAnyDbQueryMiddleware
Middleware aktivieren und dann die ausgeführten Abfragen in der terminate
Methode 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 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ügen
$app['events']->listen('artisan.start', function(){
\DB::enableQueryLog();
});
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();
}
Verweise
\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:
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 $lcWhatYouWant
obigen Variablen werden die Variablen durch ersetzt. ??
)
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, wobei "mysql2" ist)
Fügen Sie dies in die Datei route.php ein:
\Event::listen('Illuminate\Database\Events\QueryExecuted', function ($query) {
echo'<pre>';
var_dump($query->sql);
var_dump($query->bindings);
var_dump($query->time);
echo'</pre>';
});
Eingereicht von msurguy, Quellcode auf dieser Seite . Diesen Fixcode für Laravel 5.2 finden Sie in den Kommentaren.
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::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:
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);
}
);
Für Laravel 5.8 fügen Sie einfach dd oder dump hinzu .
Ex:
DB::table('users')->where('votes', '>', 100)->dd();
oder
DB::table('users')->where('votes', '>', 100)->dump();
Verwenden Sie toSql()
statt get()
wie folgt:
$users = User::orderBy('name', 'asc')->toSql();
echo $users;
// Outputs the string:
'select * from `users` order by `name` asc'
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:
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
$log = new Logger('sql');
$log->pushHandler(new StreamHandler(storage_path().'/logs/sql-' . date('Y-m-d') . '.log', Logger::INFO));
// add records to the log
$log->addInfo($query, $data);
Dieser Code ist für:
Hier ist der Code, der auf der Antwort von @milz basiert:
DB::listen(function($sql) {
$LOG_TABLE_NAME = 'log';
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);
if(stripos($query, 'insert into `'.$LOG_TABLE_NAME.'`')===false){
$toLog = new LogModel();
$toLog->uId = 100;
$toLog->sql = $query;
$toLog->save();
}
});
Der Kern ist die if(stripos...
Zeile, die die Rekursion des Einfügens der insert into log
SQL-Anweisung in die Datenbank verhindert.
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
der boot
Methode nur einen Rückruf hinzufügen , um DB-Abfragen abzuhören:
namespace App\Providers;
use DB;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
public function boot()
{
DB::listen(function($query) {
logger()->info($query->sql . print_r($query->bindings, true));
});
}
}
Angenommen, Sie möchten die SQL-Abfrage der folgenden Anweisungen drucken.
$user = User::find(5);
Sie müssen nur Folgendes tun:
DB::enableQueryLog();//enable query logging
$user = User::find(5);
print_r(DB::getQueryLog());//print sql query
Dadurch wird die zuletzt ausgeführte Abfrage in Laravel gedruckt.
Für Laravel 5 und höher reicht es nicht, nur DB :: getQueryLog () zu verwenden. Standardmäßig ist dies der Wert von
protected $loggingQueries = false;
ändere es auf
protected $loggingQueries = true;
in der folgenden Datei für die Protokollierungsabfrage.
/vendor/laravel/framework/src/illuminate/Database/Connection.php
Und dann können wir das verwenden, DB::getQueryLog()
wo Sie die Abfrage drucken möchten.
vendor
Dateien zu bearbeiten . Sie müssen original aufbewahrt werden.