Untuk siklus permintaan HTTP, Anda dapat mengaktifkan log kueri dalam handlemetode beberapa BeforeAnyDbQueryMiddlewaremiddleware dan kemudian mengambil kueri yang dieksekusi dalam terminatemetode middleware yang sama.
classBeforeAnyDbQueryMiddleware{publicfunction handle($request,Closure $next){
DB::enableQueryLog();return $next($request);}publicfunction terminate($request, $response){// Store or dump the log data...
dd(
DB::getQueryLog());}}
Rantai middleware tidak akan berjalan untuk perintah artisan, jadi untuk eksekusi CLI Anda dapat mengaktifkan log kueri di artisan.startpendengar acara.
Misalnya Anda bisa memasukkannya ke dalam bootstrap/app.phpfile
Laravel menyimpan semua pertanyaan dalam memori. Jadi dalam beberapa kasus, seperti saat memasukkan banyak baris, atau memiliki pekerjaan yang berjalan lama dengan banyak pertanyaan, ini dapat menyebabkan aplikasi menggunakan memori berlebih.
Dalam kebanyakan kasus, Anda akan memerlukan log kueri hanya untuk debugging, dan jika itu yang saya sarankan Anda mengaktifkannya hanya untuk pengembangan.
if(App::environment('local')){// The environment is local
DB::enableQueryLog();}
Jika sistem Anda menggunakan lebih dari satu koneksi db, Anda harus menentukannya, jika tidak maka akan mengembalikan array kosong:\DB::connection('myconnection')->enableQueryLog(); print_r(\DB::connection('myconnection')->getQueryLog());
Diana R.
Posting komentar Anda sebagai jawaban Anda @DianaR.
Cara mengaktifkannya untuk masuk Eloquent "NameController :: create ();" pernyataan?
Rubén Ruíz
2
Perhatikan bahwa dalam Laravel 5.4 DB::listenfungsi panggilan balik memiliki tanda tangan yang berbeda. Ini lebih seperti ini: DB::listen(function($query) { $sql = $query->sql; $bindings = $query->bindings; $time = $query->time; ... });
racl101
45
Jika yang Anda benar-benar pedulikan adalah permintaan aktual (yang terakhir kali dijalankan) untuk keperluan debugging cepat:
DB::enableQueryLog();# your laravel query builder goes here
$laQuery = DB::getQueryLog();
$lcWhatYouWant = $laQuery[0]['query'];# <-------# optionally disable the query log:
DB::disableQueryLog();
lakukan print_r()on $laQuery[0]untuk mendapatkan permintaan penuh, termasuk binding. ( $lcWhatYouWantvariabel di atas akan diganti dengan variabel ??)
Jika Anda menggunakan sesuatu selain koneksi mysql utama, Anda harus menggunakan ini sebagai gantinya:
kemana kode ini pergi? (5.4) Saya sudah mencoba controller, model, dan mencari di middleware, tidak yakin di mana harus menjalankannya sebelum saya mendapatkan kesalahan db.
blamb
Jika Anda mendapatkan kesalahan saat menjalankan kueri yang menghentikan eksekusi, kesalahan tersebut harus memberi tahu Anda apa masalahnya. Jika Anda memiliki kesalahan dimatikan, Anda dapat memeriksa log kesalahan di / storage / log / laravel atau sesuatu seperti itu. (Saya tidak ada di komputer saya saat ini) Jika Anda mengatakan Anda mendapatkan kesalahan dalam menjalankan kode yang saya sarankan dalam jawaban saya, pastikan Anda menyertakan fasad DB di mana pun Anda menjalankan kode. Tidak yakin apa yang Anda coba lakukan, tetapi pengontrol terdengar seperti yang paling benar dari opsi yang Anda sebutkan. (Saya biasanya menjalankan query dalam kelas pembantu terpisah)
Skeets
15
Anda harus terlebih dahulu mengaktifkan pencatatan permintaan
DB::enableQueryLog();
Kemudian Anda bisa mendapatkan log kueri hanya dengan:
dd(DB::getQueryLog());
Akan lebih baik jika Anda mengaktifkan pencatatan log sebelum aplikasi dimulai, yang dapat Anda lakukan di BeforeMiddleware dan kemudian mengambil kueri yang dieksekusi di AfterMiddleware.
Agak kotor, tapi +1 untuk $ query-> binding dan $ query-> petunjuk waktu
Paolo Stefan
Rapi! Menggunakan ini menunjukkan hasil dalam tampilan, tepat di tempat permintaan itu terjadi!
Charles Wood
11
Rupanya dengan Laravel 5.2, penutupan DB::listenhanya menerima parameter tunggal.
Jadi, jika Anda ingin menggunakan DB::listenLaravel 5.2, Anda harus melakukan sesuatu seperti:
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);
Itu ide yang buruk, untuk mengedit vendorfile. Mereka harus tetap asli.
shukshin.ivan
@ shukshin.ivan Ya kita tidak boleh mengedit file vendor tetapi untuk mendapatkan permintaan yang tepat kita telah mengedit kode ini untuk sementara waktu maka kita dapat mengubahnya kembali.
Jawaban:
Secara default, log kueri dinonaktifkan di Laravel 5: https://github.com/laravel/framework/commit/e0abfe5c49d225567cb4dfd56df9ef05cc297448
Anda harus mengaktifkan log kueri dengan menelepon:
atau daftarkan pendengar acara:
Beberapa tips
1. Banyak koneksi DB
Jika Anda memiliki lebih dari satu koneksi DB, Anda harus menentukan koneksi mana yang akan dicatat
Untuk mengaktifkan log kueri untuk
my_connection
:Untuk mendapatkan log permintaan untuk
my_connection
:2. Di mana harus mengaktifkan log kueri?
Untuk siklus permintaan HTTP, Anda dapat mengaktifkan log kueri dalam
handle
metode beberapaBeforeAnyDbQueryMiddleware
middleware dan kemudian mengambil kueri yang dieksekusi dalamterminate
metode middleware yang sama.Rantai middleware tidak akan berjalan untuk perintah artisan, jadi untuk eksekusi CLI Anda dapat mengaktifkan log kueri di
artisan.start
pendengar acara.Misalnya Anda bisa memasukkannya ke dalam
bootstrap/app.php
file3. Memori
Laravel menyimpan semua pertanyaan dalam memori. Jadi dalam beberapa kasus, seperti saat memasukkan banyak baris, atau memiliki pekerjaan yang berjalan lama dengan banyak pertanyaan, ini dapat menyebabkan aplikasi menggunakan memori berlebih.
Dalam kebanyakan kasus, Anda akan memerlukan log kueri hanya untuk debugging, dan jika itu yang saya sarankan Anda mengaktifkannya hanya untuk pengembangan.
Referensi
sumber
\DB::connection('myconnection')->enableQueryLog(); print_r(\DB::connection('myconnection')->getQueryLog());
DB::listen
fungsi panggilan balik memiliki tanda tangan yang berbeda. Ini lebih seperti ini:DB::listen(function($query) { $sql = $query->sql; $bindings = $query->bindings; $time = $query->time; ... });
Jika yang Anda benar-benar pedulikan adalah permintaan aktual (yang terakhir kali dijalankan) untuk keperluan debugging cepat:
lakukan
print_r()
on$laQuery[0]
untuk mendapatkan permintaan penuh, termasuk binding. ($lcWhatYouWant
variabel di atas akan diganti dengan variabel??
)Jika Anda menggunakan sesuatu selain koneksi mysql utama, Anda harus menggunakan ini sebagai gantinya:
(dengan nama koneksi Anda di mana "mysql2" berada)
sumber
Anda harus terlebih dahulu mengaktifkan pencatatan permintaan
Kemudian Anda bisa mendapatkan log kueri hanya dengan:
Akan lebih baik jika Anda mengaktifkan pencatatan log sebelum aplikasi dimulai, yang dapat Anda lakukan di BeforeMiddleware dan kemudian mengambil kueri yang dieksekusi di AfterMiddleware.
sumber
Letakkan ini di file routes.php:
Dikirim oleh msurguy, kode sumber di halaman ini . Anda akan menemukan kode perbaikan ini untuk laravel 5.2 dalam komentar.
sumber
Rupanya dengan Laravel 5.2, penutupan
DB::listen
hanya menerima parameter tunggal.Jadi, jika Anda ingin menggunakan
DB::listen
Laravel 5.2, Anda harus melakukan sesuatu seperti:sumber
Untuk laravel 5.8 Anda tinggal menambahkan dd atau dump .
Ex:
atau
referensi: https://laravel.com/docs/5.8/queries#debugging
sumber
Gunakan
toSql()
bukannyaget()
seperti itu:sumber
(Laravel 5.2) Saya menemukan cara paling sederhana adalah dengan menambahkan satu baris kode untuk memantau kueri sql:
sumber
Dalam melanjutkan Rupanya dengan Laravel 5.2, penutupan di DB :: listen hanya menerima parameter tunggal ... respons di atas: Anda dapat memasukkan kode ini ke dalam skrip Middleware dan menggunakannya dalam rute.
Selain itu:
sumber
Kode ini untuk:
Ini adalah kode yang didasarkan pada jawaban @milz:
Inti adalah
if(stripos...
garis, yang mencegah rekursi memasukkaninsert into log
pernyataan sql ke dalam basis data.sumber
Saya pikir jawabannya ada di artikel ini: https://arjunphp.com/laravel-5-5-log-eloquent-queries/
cepat dan mudah untuk mencapai pencatatan permintaan.
Anda hanya perlu menambahkan ke
AppServiceProvider
dalamboot
metode panggilan balik untuk mendengarkan pertanyaan DB:sumber
Misalkan Anda ingin mencetak query SQL dari pernyataan berikut.
Anda hanya perlu melakukan hal berikut:
Ini akan mencetak kueri yang terakhir dieksekusi di Laravel.
sumber
Untuk laravel 5 dan seterusnya hanya menggunakan DB :: getQueryLog (), tidak akan dilakukan. Secara default dalam hal ini nilai
ubah ke
dalam file di bawah ini untuk kueri logging.
Dan kemudian kita bisa menggunakan
DB::getQueryLog()
tempat Anda ingin mencetak kueri.sumber
vendor
file. Mereka harus tetap asli.