Ich entwickle jetzt eine Anwendung und platziere einen globalen isDebug
Schalter. Ich möchte console.log
für eine bequemere Verwendung wickeln .
//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.');
Dann bekomme ich dieses Ergebnis in der Firefox-Konsole.
info: Here is a msg. debug.js (line 8)
Was ist, wenn ich mich mit der Zeilennummer anmelden möchte, unter debug()
der angerufen wird info: Here is a msg. main.js (line 2)
?
javascript
Rufus
quelle
quelle
console.log
Informationen,console.warn
Warnungen undconsole.error
Fehler verwenden, anstatt etwasconsole.log
über eine Wrapper-Funktion hinzuzufügen .console
er verwendet werden muss. Um ein solches Ziel zu erreichen, scheint ein Wrapper der einzige Weg zu sein?Antworten:
Dies ist eine alte Frage, und alle Antworten sind übermäßig hektisch, haben große browserübergreifende Probleme und bieten nichts besonders Nützliches. Diese Lösung funktioniert in jedem Browser und meldet alle Konsolendaten genau so, wie sie sollten. Keine Hacks erforderlich und eine Codezeile Überprüfen Sie den Codepen .
Erstellen Sie den Schalter wie folgt:
Dann rufen Sie einfach wie folgt an:
Sie können sogar die console.log mit einem Schalter wie diesem übernehmen:
Wenn Sie damit etwas Nützliches tun möchten, können Sie alle Konsolenmethoden hinzufügen und in eine wiederverwendbare Funktion einbinden, die nicht nur globale Kontrolle, sondern auch Klassenebene bietet:
Jetzt können Sie es Ihren Klassen hinzufügen:
quelle
console.log
zweimal eine benutzerdefiniertelog()
Funktion binden, die zwei Aufrufe enthält. Dieconsole.log
Zeilennummern geben jedoch die Leitung wieder, in der sie sichconsole.log
tatsächlich befinden, und nicht die Stelle, an der siedebug.log
aufgerufen wird. Sie können jedoch beispielsweise dynamische Präfixe / Suffixe usw. hinzufügen. Es gibt auch Möglichkeiten, das Problem mit der Zeilennummer zu kompensieren, aber das ist eine andere Frage, die ich denke. Schauen Sie sich dieses Projekt für ein Beispiel an: github.com/arctelix/iDebugConsole/blob/master/README.mdthis.isDebug
,false
spielt dies keine Rolle. Ich weiß nur nicht, ob es einen Weg gibt, vielleicht ist es beabsichtigt. In diesem Sinne ist dasisDebug
ziemlich irreführendvar
und sollteconst
stattdessen ein sein.Ich mochte die Antwort von @ fredrik , also habe ich sie mit einer anderen Antwort zusammengefasst, die den Webkit-Stacktrace aufteilt , und sie mit dem sicheren console.log-Wrapper von @ PaulIrish zusammengeführt . "Standardisiert" das
filename:line
zu einem "speziellen Objekt", so dass es auffällt und in FF und Chrome größtenteils gleich aussieht.Testen in Geige: http://jsfiddle.net/drzaus/pWe6W/
Dies funktioniert auch im Knoten und Sie können es testen mit:
quelle
console
Methoden wiewarn
,error
usw. - stackoverflow.com/a/14842659/1037948var line = stack.split('\n')[2];
-'undefined' is not an object
if(!stack) return '?'
zu der Methode, die fehlschlägt, anstatt wo sie aufgerufen wird (wenn also jemand die Methode selbst verwendet, ist er auch "geschützt")Sie können Zeilennummern pflegen und die Protokollebene ausgeben, indem Sie Folgendes verwenden
Function.prototype.bind
:Wenn Sie noch einen Schritt weiter gehen, können Sie das nutzen
console
Fehler- / Warn- / Info-Unterscheidungen des Benutzers verwenden und dennoch benutzerdefinierte Ebenen verwenden. Versuch es!quelle
console.debug(...)
mitfunction name
undarguments
- irgendwelche Gedanken darüber, wie das geht?%s
mit%o
in Chrome werden die Parameter in der Art und Weise drucken Sie erwarten würden (Objekte sind erweiterbar, Zahlen und Strings sind farbig, etc).Von: Wie erhalte ich die Funktionszeilennummer des JavaScript-Anrufers? Wie erhalte ich die Quell-URL des JavaScript-Anrufers? Das
Error
Objekt hat eine Zeilennummer-Eigenschaft (in FF). So etwas sollte funktionieren:Im Webkit-Browser
err.stack
ist dies eine Zeichenfolge, die den aktuellen Aufrufstapel darstellt. Es wird die aktuelle Zeilennummer und weitere Informationen angezeigt.AKTUALISIEREN
Um die richtige Leinenzahl zu erhalten, müssen Sie den Fehler in dieser Zeile aufrufen. Etwas wie:
quelle
new Error();
gibt mir den Kontext, in dem es ausgeführt wird, wenn ich es einfügedebug.js
, dann werde ich bekommeninfo: Here is a msg. file: http://localhost/js/debug.js line:7
.Log = Error
? Sie ändern immer noch die Fehlerklasse, oder?Eine Möglichkeit, die Zeilennummer beizubehalten, finden Sie hier: https://gist.github.com/bgrins/5108712 . Es läuft mehr oder weniger darauf hinaus:
Sie können dies umbrechen
isDebug
und festlegenwindow.log
,function() { }
wenn Sie nicht debuggen.quelle
Sie können die Zeilennummer wie folgt an Ihre Debug-Methode übergeben:
Hier
(new Error).lineNumber
würde Ihnen die aktuelle Zeilennummer in Ihremjavascript
Code geben.quelle
Mit Chrome Devtools können Sie dies mit Blackboxing erreichen . Sie können den console.log-Wrapper erstellen, der Nebenwirkungen haben kann, andere Funktionen aufrufen usw. und dennoch die Zeilennummer beibehalten, die die wrapper-Funktion aufgerufen hat.
Fügen Sie einfach einen kleinen console.log-Wrapper in eine separate Datei ein, z
Nennen Sie es so etwas wie log-blackbox.js
Gehen Sie dann zu den Chrome Devtools-Einstellungen und suchen Sie den Abschnitt "Blackboxing". Fügen Sie ein Muster für den Dateinamen hinzu, den Sie blackboxen möchten, in diesem Fall log-blackbox.js
quelle
Ich habe eine einfache Lösung gefunden, um die akzeptierte Antwort (Bindung an console.log / error / etc) mit einer externen Logik zu kombinieren, um zu filtern, was tatsächlich protokolliert wird.
Verwendung:
console.assert
die bedingte Protokollierung verwendet wird.quelle
Wenn Sie einfach steuern möchten, ob Debug verwendet wird und die richtige Zeilennummer haben, können Sie dies stattdessen tun:
Wenn Sie Zugriff auf das Debuggen benötigen, können Sie dies tun:
Wenn
isDebug == true
, sind die in der Konsole angezeigten Zeilennummern und Dateinamen korrekt, dadebug.log
etc tatsächlich ein Alias vonconsole.log
etc. ist.Wenn
isDebug == false
keine Debug-Meldungen angezeigt werden, weildebug.log
etc einfach nichts tut (eine leere Funktion).Wie Sie bereits wissen, werden die Zeilennummern und Dateinamen durch eine Wrapper-Funktion durcheinander gebracht. Es empfiehlt sich daher, die Verwendung von Wrapper-Funktionen zu vermeiden.
quelle
isDebug = true
und seindebug.js
, aber diese Antwort funktioniert!window.debug = window.console
wäre ein bisschen sauberer.isDebug == false
. : {isDebug===true
. Oder Ereignis dazu: jsfiddle.net/fredrik/x6Jw5Stack-Trace-Lösungen zeigen die Zeilennummer an, erlauben jedoch nicht das Klicken, um zur Quelle zu gelangen. Dies ist ein großes Problem. Die einzige Lösung, um dieses Verhalten beizubehalten , besteht darin , an die ursprüngliche Funktion zu binden .
Durch die Bindung wird verhindert, dass Zwischenlogik eingeschlossen wird, da diese Logik mit Zeilennummern in Konflikt geraten würde. Indem Sie jedoch gebundene Funktionen neu definieren und mit der Ersetzung von Konsolenzeichenfolgen spielen ist jedoch noch ein zusätzliches Verhalten möglich.
Diese Übersicht zeigt ein minimalistisches Protokollierungsframework, das Module, Protokollebenen, Formatierungen und ordnungsgemäß anklickbare Zeilennummern in 34 Zeilen bietet. Verwenden Sie es als Grundlage oder Inspiration für Ihre eigenen Bedürfnisse.
EDIT: Kern unten enthalten
quelle
Die Idee mit bind
Function.prototype.bind
ist genial. Sie können auch den npm library lines-logger verwenden . Es zeigt Ursprungsquelldateien:Erstellen Sie einmal in Ihrem Projekt einen Logger:
Protokolle drucken:
quelle
Hier ist eine Möglichkeit, Ihre vorhandenen
console
Protokollierungsanweisungen beizubehalten, während Sie der Ausgabe einen Dateinamen und eine Zeilennummer oder andere Stapelverfolgungsinformationen hinzufügen:Dann benutze es so:
Dies funktioniert in Firefox, Opera, Safari, Chrome und IE 10 (noch nicht auf IE11 oder Edge getestet).
quelle
my test log message (myscript.js:42) VM167 mypage.html:15
folgt :), die nicht so gut zu lesen ist und nicht verknüpft ist. Immer noch gute Arbeit also eine Gegenstimme.Das wird mir geben
info: "Here is a msg." main.js(line:2)
.Aber das Extra
eval
ist nötig, schade.quelle
Code von http://www.briangrinstead.com/blog/console-log-helper-function :
quelle
log
ausIch habe mich in letzter Zeit selbst mit diesem Thema befasst. Benötigte etwas sehr einfaches, um die Protokollierung zu steuern, aber auch um die Zeilennummern beizubehalten. Meine Lösung sieht im Code nicht so elegant aus, bietet aber das, was für mich benötigt wird. Wenn man mit Verschlüssen und Zurückhalten vorsichtig genug ist.
Ich habe am Anfang der Anwendung einen kleinen Wrapper hinzugefügt:
Damit ich später einfach machen kann:
Ich habe es von Firefox und Crome getestet, und beide Browser scheinen das Konsolenprotokoll wie beabsichtigt anzuzeigen. Wenn Sie so ausfüllen, können Sie die 'd'-Methode jederzeit erweitern und andere Parameter an sie übergeben, damit eine zusätzliche Protokollierung durchgeführt werden kann.
Ich habe noch keine ernsthaften Nachteile für meinen Ansatz gefunden, außer der hässlichen Zeile im Code für die Protokollierung.
quelle
Hier war meine Lösung zu dieser Frage. Wenn Sie die Methode: log aufrufen, wird die Zeilennummer gedruckt, in der Sie Ihr Protokoll drucken
quelle
Eine kleine Variation besteht darin, dass debug () eine Funktion zurückgibt, die dann dort ausgeführt wird, wo Sie sie benötigen - debug (message) (); Auf diese Weise wird die richtige Zeilennummer und das aufrufende Skript im Konsolenfenster korrekt angezeigt, wobei Variationen wie das Umleiten als Warnung oder das Speichern in einer Datei berücksichtigt werden.
Da es eine Funktion zurückgibt, muss diese Funktion in der Debug-Zeile mit (); ausgeführt werden. Zweitens wird die Nachricht an die Debug-Funktion gesendet und nicht an die zurückgegebene Funktion, die eine Vorverarbeitung oder Überprüfung ermöglicht, die Sie möglicherweise benötigen, z. B. den Status auf Protokollebene überprüfen, die Lesbarkeit der Nachricht verbessern, verschiedene Typen überspringen oder nur Elemente melden Erfüllung der Protokollebenenkriterien;
quelle
Sie könnten die Logik hier vereinfachen. Dies setzt voraus, dass Ihr globales Debug-Flag NICHT dynamisch ist und beim Laden der App gesetzt oder als Konfiguration übergeben wird. Dies ist für die Umgebungskennzeichnung vorgesehen (z. B. nur Drucken im Entwicklungsmodus und nicht im Produktionsmodus).
Vanilla JS:
ES6:
Modul:
Winkel 1.x:
Jetzt müssen Sie nur noch alle Konsolenreferenzen durch Logger ersetzen
quelle
Diese Implementierung basiert auf der ausgewählten Antwort und hilft, das Rauschen in der Fehlerkonsole zu reduzieren: https://stackoverflow.com/a/32928812/516126
quelle
Ich fand einige der Antworten auf dieses Problem etwas zu komplex für meine Bedürfnisse. Hier ist eine einfache Lösung, die in Coffeescript gerendert wird. Es ist eine Adaption von Brian Grinsteads Version hier
Es wird das globale Konsolenobjekt angenommen.
quelle
Die Art und Weise, wie ich es gelöst habe, bestand darin, ein Objekt zu erstellen, dann mit Object.defineProperty () eine neue Eigenschaft für das Objekt zu erstellen und die Konsoleneigenschaft zurückzugeben, die dann als normale Funktion verwendet wurde, jetzt jedoch mit der erweiterten Fähigkeit.
Um eine Eigenschaft zu definieren, tun Sie einfach ...
Und jetzt können Sie Ihre Funktion genauso nutzen
quelle
Basierend auf anderen Antworten (hauptsächlich @arctelix one) habe ich dies für Node ES6 erstellt, aber ein schneller Test zeigte auch im Browser gute Ergebnisse. Ich übergebe nur die andere Funktion als Referenz.
quelle
Hier ist meine Logger-Funktion (basierend auf einigen Antworten). Hoffe, jemand kann davon Gebrauch machen:
Beispiele:
quelle