Bir sorgu için günlük görüntülemeye çalışıyorum, ama DB::getQueryLog()
sadece boş bir dizi döndürüyor:
$user = User::find(5);
print_r(DB::getQueryLog());
Sonuç
Array
(
)
Bu sorgunun günlüğünü nasıl görüntüleyebilirim?
Bir sorgu için günlük görüntülemeye çalışıyorum, ama DB::getQueryLog()
sadece boş bir dizi döndürüyor:
$user = User::find(5);
print_r(DB::getQueryLog());
Sonuç
Array
(
)
Bu sorgunun günlüğünü nasıl görüntüleyebilirim?
Yanıtlar:
Varsayılan olarak, sorgu günlüğü Laravel 5'te devre dışı bırakılmıştır: https://github.com/laravel/framework/commit/e0abfe5c49d225567cb4dfd56df9ef05cc297448
Sorgu günlüğünü aşağıdakileri arayarak etkinleştirmeniz gerekir:
DB::enableQueryLog();
veya bir olay dinleyicisini kaydettirin:
DB::listen(
function ($sql, $bindings, $time) {
// $sql - select * from `ncv_users` where `ncv_users`.`id` = ? limit 1
// $bindings - [5]
// $time(in milliseconds) - 0.38
}
);
Birden fazla DB bağlantınız varsa, hangi bağlantının günlüğe kaydedileceğini belirtmelisiniz
Sorgu günlüğünü etkinleştirmek için my_connection
:
DB::connection('my_connection')->enableQueryLog();
Şunun için sorgu günlüğünü almak için my_connection
:
print_r(
DB::connection('my_connection')->getQueryLog()
);
Bir HTTP isteği yaşam döngüsü için, handle
bazı BeforeAnyDbQueryMiddleware
ara katman yazılımının yönteminde sorgu günlüğünü etkinleştirebilir ve daha sonra terminate
aynı ara katman yazılımının yönteminde yürütülen sorguları alabilirsiniz .
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()
);
}
}
Bir ara yazılım zinciri esnaf komutları için çalışmaz, bu nedenle CLI yürütmesi için artisan.start
olay dinleyicisinde sorgu günlüğünü etkinleştirebilirsiniz .
Örneğin, bootstrap/app.php
dosyaya koyabilirsiniz
$app['events']->listen('artisan.start', function(){
\DB::enableQueryLog();
});
Laravel tüm sorguları hafızada tutar. Bu nedenle, çok sayıda satır eklerken veya çok fazla sorguyla uzun süren bir işte çalışırken, bu durum uygulamanın fazla bellek kullanmasına neden olabilir.
Çoğu durumda sorgu günlüğüne yalnızca hata ayıklama için ihtiyacınız olacaktır ve bu durumda yalnızca geliştirme için etkinleştirmenizi öneririm.
if (App::environment('local')) {
// The environment is local
DB::enableQueryLog();
}
Referanslar
\DB::connection('myconnection')->enableQueryLog(); print_r(\DB::connection('myconnection')->getQueryLog());
DB::listen
geri arama işlevinin farklı bir imzası olduğunu unutmayın. Daha çok şöyle: DB::listen(function($query) { $sql = $query->sql; $bindings = $query->bindings; $time = $query->time; ... });
Gerçekten önemsediğiniz tek şey, hızlı hata ayıklama amacıyla asıl sorgu (son çalışma) ise:
DB::enableQueryLog();
# your laravel query builder goes here
$laQuery = DB::getQueryLog();
$lcWhatYouWant = $laQuery[0]['query']; # <-------
# optionally disable the query log:
DB::disableQueryLog();
bağlamalar dahil tam sorguyu almak için bir print_r()
açık $laQuery[0]
yapın. ( $lcWhatYouWant
yukarıdaki değişkenin yerine değişkenler gelir ??
)
Ana mysql bağlantısı dışında bir şey kullanıyorsanız, bunun yerine bunları kullanmanız gerekir:
DB::connection("mysql2")->enableQueryLog();
DB::connection("mysql2")->getQueryLog();
("mysql2" nin bulunduğu bağlantı adınızla)
İlk olarak sorgu günlüğünü etkinleştirmeniz gerekir
DB::enableQueryLog();
Sonra basitçe sorgu günlükleri alabilirsiniz:
dd(DB::getQueryLog());
Uygulama başlamadan önce sorgu günlüğünü etkinleştirirseniz, bir BeforeMiddleware içinde yapabilir ve sonra AfterMiddleware'de yürütülen sorguları alabilirsiniz.
Bunu route.php dosyasına koyun:
\Event::listen('Illuminate\Database\Events\QueryExecuted', function ($query) {
echo'<pre>';
var_dump($query->sql);
var_dump($query->bindings);
var_dump($query->time);
echo'</pre>';
});
Bu sayfadaki kaynak kodu msurguy tarafından sunulmuştur . Laravel 5.2 için bu düzeltme kodunu yorumlarda bulabilirsiniz.
Görünüşe göre Laravel 5.2 ile, kapak DB::listen
sadece tek bir parametre alıyor.
Yani, DB::listen
Laravel 5.2'de kullanmak istiyorsanız , şöyle bir şey yapmalısınız:
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);
}
);
İçin laravel 5,8 sadece eklemek dd veya dökümü .
Ör:
DB::table('users')->where('votes', '>', 100)->dd();
veya
DB::table('users')->where('votes', '>', 100)->dump();
toSql()
Bunun yerine kullanın get()
:
$users = User::orderBy('name', 'asc')->toSql();
echo $users;
// Outputs the string:
'select * from `users` order by `name` asc'
Görünüşe göre Laravel 5.2 ile devam ederken, DB :: listen'deki kapatma sadece tek bir parametre ... yukarıdaki yanıtı alır: bu kodu Middleware betiğine koyabilir ve yollarda kullanabilirsiniz.
Bunlara ek olarak:
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);
Bu kod:
İşte milz'in cevabına dayanan kod:
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();
}
});
Çekirdek, sql deyimini veritabanına if(stripos...
eklemenin tekrarlanmasını önleyen çizgidir insert into log
.
Bence bu makalede verilen cevap: https://arjunphp.com/laravel-5-5-log-eloquent-queries/
sorgu günlüğü elde etmek için hızlı ve basittir.
Sadece eklemek zorunda AppServiceProvider
içinde boot
DB sorguları dinlemek için yöntemin bir geri arama:
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));
});
}
}
Aşağıdaki ifadelerin SQL sorgusunu yazdırmak istediğinizi varsayalım.
$user = User::find(5);
Sadece aşağıdaki gibi yapmanız gerekir:
DB::enableQueryLog();//enable query logging
$user = User::find(5);
print_r(DB::getQueryLog());//print sql query
Bu, Laravel'de son yürütülen sorguyu yazdırır.
Sadece DB :: getQueryLog () kullanarak laravel 5 ve sonrası için, yapmaz. Bu varsayılan: tarafından
protected $loggingQueries = false;
olarak değiştir
protected $loggingQueries = true;
günlük kaydı sorgusu.
/vendor/laravel/framework/src/illuminate/Database/Connection.php
Ve sonra DB::getQueryLog()
sorguyu yazdırmak istediğiniz yeri kullanabiliriz .
vendor
Dosyaları düzenlemek kötü bir fikirdir . Orijinal olarak saklanmalıdır.