Saya sekarang sedang mengembangkan aplikasi, dan melakukan isDebug
peralihan global . Saya ingin membungkus console.log
untuk penggunaan yang lebih nyaman.
//isDebug controls the entire site.
var isDebug = true;
//debug.js
function debug(msg, level){
var Global = this;
if(!(Global.isDebug && Global.console && Global.console.log)){
return;
}
level = level||'info';
Global.console.log(level + ': '+ msg);
}
//main.js
debug('Here is a msg.');
Lalu saya mendapatkan hasil ini di konsol Firefox.
info: Here is a msg. debug.js (line 8)
Bagaimana jika saya ingin login dengan nomor baris di mana debug()
dipanggil, seperti info: Here is a msg. main.js (line 2)
?
javascript
Rufus
sumber
sumber
console.log
info,console.warn
untuk peringatan danconsole.error
kesalahan, alih-alih menambahkan sesuatuconsole.log
melalui fungsi wrapper.console
perlu digunakan. Untuk mencapai tujuan tersebut, pembungkus sepertinya menjadi satu-satunya cara?Jawaban:
Ini adalah pertanyaan lama dan Semua jawaban yang diberikan terlalu hackey, memiliki masalah lintas browser UTAMA, dan tidak memberikan sesuatu yang super berguna. Solusi ini berfungsi di setiap browser dan melaporkan semua data konsol persis seperti yang seharusnya. Tidak diperlukan peretasan dan satu baris kode. Lihat codepen .
Buat sakelar seperti ini:
Maka cukup hubungi sebagai berikut:
Anda bahkan dapat mengambil alih console.log dengan sakelar seperti ini:
Jika Anda ingin melakukan sesuatu yang bermanfaat dengan itu .. Anda dapat menambahkan semua metode konsol dan membungkusnya dalam fungsi yang dapat digunakan kembali yang tidak hanya memberikan kontrol global, tetapi juga tingkat kelas:
Sekarang Anda dapat menambahkannya ke kelas Anda:
sumber
console.log
dua kali dengan mengikatlog()
fungsi kustom yang berisi dua panggilanconsole.log
, namun nomor baris akan mencerminkan baris yangconsole.log
sebenarnya berada, bukan tempatdebug.log
dipanggil. Namun, Anda dapat melakukan hal-hal seperti menambahkan awalan dinamis / sufiks dll. Ada juga cara untuk mengkompensasi masalah nomor baris, tapi itu pertanyaan lain yang saya pikir. Lihat proyek ini sebagai contoh: github.com/arctelix/iDebugConsole/blob/master/README.mdthis.isDebug
kefalse
, tidak akan peduli. Saya hanya tidak tahu apakah ada jalan keluarnya, mungkin karena desain. Dalam hal itu, ituisDebug
adalah hal yang cukup menyesatkanvar
dan harus menjadiconst
sebaliknya.Saya menyukai jawaban @ fredrik , jadi saya menggulungnya dengan jawaban lain yang membagi stacktrace Webkit , dan menggabungkannya dengan pembungkus aman console.log @ PaulIrish . "Membakukan"
filename:line
ke "objek khusus" sehingga menonjol dan sebagian besar terlihat sama di FF dan Chrome.Pengujian di biola: http://jsfiddle.net/drzaus/pWe6W/
Ini juga berfungsi dalam simpul, dan Anda bisa mengujinya dengan:
sumber
console
metode sepertiwarn
,error
, dll - stackoverflow.com/a/14842659/1037948var line = stack.split('\n')[2];
-'undefined' is not an object
if(!stack) return '?'
ke metode yang gagal, bukan dari tempat namanya (jadi jika ada yang menggunakan metode itu sendiri mereka juga "dilindungi")Anda dapat mempertahankan nomor baris dan mengeluarkan tingkat log dengan beberapa penggunaan cerdas
Function.prototype.bind
:Mengambil langkah lebih jauh, Anda dapat memanfaatkan perbedaan
console
error / peringatan / info dan masih memiliki tingkat kustom. Cobalah!sumber
console.debug(...)
denganfunction name
danarguments
- pemikiran tentang bagaimana melakukan hal itu?%s
dengan%o
di Chrome akan mencetak parameter seperti yang Anda harapkan (objek dapat diperbesar, angka dan string diwarnai, dll).Dari: Bagaimana cara mendapatkan nomor saluran fungsi pemanggil JavaScript? Bagaimana cara mendapatkan URL sumber pemanggil JavaScript? yang
Error
objek memiliki properti nomor baris (di FF). Jadi sesuatu seperti ini seharusnya bekerja:Di browser Webkit Anda memiliki
err.stack
string yang mewakili tumpukan panggilan saat ini. Ini akan menampilkan nomor baris saat ini dan informasi lainnya.MEMPERBARUI
Untuk mendapatkan linenumber yang benar, Anda harus mengaktifkan kesalahan pada baris itu. Sesuatu seperti:
sumber
new Error();
memberi saya konteks di mana dieksekusi, jika saya memasukkannyadebug.js
, maka saya akan mendapatkannyainfo: Here is a msg. file: http://localhost/js/debug.js line:7
.Log = Error
? Anda masih memodifikasi kelas Kesalahan, bukan?Cara untuk menyimpan nomor saluran ada di sini: https://gist.github.com/bgrins/5108712 . Ini kurang lebih bermuara pada ini:
Anda dapat membungkus ini dengan
isDebug
dan mengaturwindow.log
kefunction() { }
jika Anda tidak men-debug.sumber
Anda dapat meneruskan nomor baris ke metode debug Anda, seperti ini:
Di sini,
(new Error).lineNumber
akan memberi Anda nomor baris saat ini dalamjavascript
kode Anda .sumber
Chrome Devtools memungkinkan Anda mencapai ini dengan Blackboxing . Anda dapat membuat pembungkus konsol.log yang dapat memiliki efek samping, memanggil fungsi lain, dll, dan masih mempertahankan nomor baris yang disebut fungsi pembungkus.
Cukup masukkan pembungkus console.log kecil ke dalam file terpisah, mis
Beri nama itu seperti log-blackbox.js
Lalu pergi ke pengaturan Chrome Devtools dan temukan bagian "Blackboxing", tambahkan pola untuk nama file yang ingin Anda blackbox, dalam hal ini log-blackbox.js
sumber
Saya menemukan solusi sederhana untuk menggabungkan jawaban yang diterima (mengikat ke console.log / error / etc) dengan beberapa logika luar untuk menyaring apa yang sebenarnya dicatat.
Pemakaian:
console.assert
menggunakan logging bersyarat.sumber
Jika Anda hanya ingin mengontrol apakah debug digunakan dan memiliki nomor baris yang benar, Anda dapat melakukan ini sebagai gantinya:
Ketika Anda membutuhkan akses untuk debug, Anda dapat melakukan ini:
Jika
isDebug == true
, Nomor baris dan nama file yang ditampilkan di konsol akan benar, karenadebug.log
dll sebenarnya adalah alias dariconsole.log
dll.Jika
isDebug == false
, tidak ada pesan debug yang ditampilkan, karenadebug.log
dll tidak melakukan apa-apa (fungsi kosong).Seperti yang sudah Anda ketahui, fungsi wrapper akan mengacaukan nomor baris dan nama file, jadi sebaiknya Anda tidak menggunakan fungsi wrapper.
sumber
isDebug = true
dandebug.js
, tetapi jawaban ini berhasil!window.debug = window.console
akan sedikit lebih bersih.isDebug == false
. : {isDebug===true
. Atau acara untuk ini: jsfiddle.net/fredrik/x6Jw5Solusi penelusuran tumpukan menampilkan nomor baris tetapi tidak mengizinkan klik untuk pergi ke sumber, yang merupakan masalah besar. Satu-satunya solusi untuk menjaga perilaku ini adalah dengan mengikat ke fungsi aslinya.
Binding mencegah untuk memasukkan logika perantara, karena logika ini akan mengacaukan dengan nomor baris. Namun, dengan mendefinisikan kembali fungsi terikat dan bermain dengan substitusi string konsol , beberapa perilaku tambahan masih dimungkinkan.
Intisari ini menunjukkan kerangka kerja logging minimalis yang menawarkan modul, level log, pemformatan, dan nomor baris yang dapat diklik dalam 34 baris. Gunakan itu sebagai dasar atau inspirasi untuk kebutuhan Anda sendiri.
EDIT: intinya termasuk di bawah ini
sumber
Ide dengan bind
Function.prototype.bind
sangat brilian. Anda juga dapat menggunakan npm library -logger . Ini menunjukkan file sumber asal:Buat siapa saja yang pernah logger di proyek Anda:
Mencetak log:
sumber
Berikut adalah cara untuk menjaga
console
pernyataan logging yang ada saat menambahkan nama file dan nomor baris atau info jejak tumpukan lainnya ke output:Kemudian gunakan seperti ini:
Ini berfungsi di Firefox, Opera, Safari, Chrome, dan IE 10 (belum diuji pada IE11 atau Edge).
sumber
my test log message (myscript.js:42) VM167 mypage.html:15
:), yang tidak terlalu baik untuk dibaca dan tidak ditautkan. Pekerjaan yang masih bagus jadi sebuah upvote.Ini akan memberiku
info: "Here is a msg." main.js(line:2)
.Tapi ekstra
eval
dibutuhkan, sayang.sumber
Kode dari http://www.briangrinstead.com/blog/console-log-helper-function :
sumber
log
dipanggil dariSaya telah melihat masalah ini sendiri belakangan ini. Membutuhkan sesuatu yang sangat lurus ke depan untuk mengendalikan penebangan, tetapi juga untuk mempertahankan nomor baris. Solusi saya tidak terlihat elegan dalam kode, tetapi memberikan apa yang dibutuhkan untuk saya. Jika seseorang cukup hati-hati dengan penutupan dan penahan.
Saya telah menambahkan pembungkus kecil ke awal aplikasi:
Sehingga nanti saya bisa langsung melakukan:
Saya sudah mengujinya dari firefox dan crome, dan kedua browser tampaknya menunjukkan log konsol sebagaimana dimaksud. Jika Anda mengisi seperti itu, Anda selalu dapat memperluas metode 'd' dan meneruskan parameter lain ke dalamnya, sehingga dapat melakukan beberapa logging tambahan.
Belum menemukan kelemahan serius untuk pendekatan saya, kecuali baris kode yang jelek untuk logging.
sumber
inilah solusi saya tentang pertanyaan ini. ketika Anda memanggil metode: log, itu akan mencetak nomor baris tempat Anda mencetak log Anda
sumber
Variasi kecil adalah memiliki debug () mengembalikan fungsi, yang kemudian dieksekusi di mana Anda membutuhkannya - debug (pesan) (); dan dengan demikian menunjukkan nomor baris yang benar dan skrip panggilan di jendela konsol, sambil memungkinkan variasi seperti mengarahkan ulang sebagai peringatan, atau menyimpan ke file.
Karena mengembalikan fungsi, fungsi itu perlu dijalankan pada baris debug dengan () ;. Kedua, pesan dikirim ke fungsi debug, alih-alih ke fungsi yang dikembalikan memungkinkan pra-pemrosesan atau pengecekan yang mungkin Anda butuhkan, seperti memeriksa status tingkat log, membuat pesan lebih mudah dibaca, melompati berbagai jenis, atau hanya melaporkan item memenuhi kriteria tingkat log;
sumber
Anda dapat menyederhanakan logika di sini. Ini mengasumsikan bendera debug global Anda TIDAK dinamis dan ditetapkan pada muat aplikasi atau diteruskan karena beberapa konfigurasi. Ini dimaksudkan untuk digunakan untuk penandaan lingkungan (mis. Hanya mencetak ketika dalam mode dev dan bukan produksi)
Vanilla JS:
ES6:
Modul:
1.x sudut:
Yang perlu Anda lakukan sekarang adalah mengganti semua referensi konsol dengan Logger
sumber
Implementasi ini didasarkan pada jawaban yang dipilih dan membantu mengurangi jumlah kebisingan di konsol kesalahan: https://stackoverflow.com/a/32928812/516126
sumber
Saya menemukan beberapa jawaban untuk masalah ini agak terlalu rumit untuk kebutuhan saya. Ini adalah solusi sederhana, disajikan dalam Coffeescript. Ini diadaptasi dari versi Brian Grinstead di sini
Ini mengasumsikan objek konsol global.
sumber
Cara saya menyelesaikannya adalah dengan membuat objek, kemudian membuat properti baru pada objek menggunakan Object.defineProperty () dan mengembalikan properti konsol, yang kemudian digunakan sebagai fungsi normal, tetapi sekarang dengan kemampuan yang diperluas.
Kemudian, untuk mendefinisikan properti yang baru saja Anda lakukan ...
Dan sekarang Anda dapat menggunakan fungsi Anda seperti
sumber
Berdasarkan jawaban lain (terutama @arctelix satu) saya membuat ini untuk Node ES6, tetapi tes cepat menunjukkan hasil yang baik di browser juga. Saya hanya melewati fungsi lain sebagai referensi.
sumber
Inilah fungsi logger saya (berdasarkan beberapa jawaban). Semoga seseorang dapat memanfaatkannya:
Contoh:
sumber