Schlechte Idee, “console.log()”-Aufrufe in Ihrem Produktions-JavaScript-Code zu belassen?

Lesezeit: 7 Minuten

Benutzer-Avatar
Charlie Kotter

Ich habe eine Menge console.log() Aufrufe in meinem JavaScript.

Sollte ich sie auskommentieren, bevor ich sie in der Produktion bereitstelle?

Ich möchte sie einfach dort belassen, damit ich mir später nicht die Mühe machen muss, die Kommentare erneut hinzuzufügen, wenn ich noch mehr debuggen muss. Ist das eine schlechte Idee?

  • Für diejenigen, die nach der Angular-Version dieser Frage suchen: stackoverflow.com/questions/42307317/…

    – rmcsharry

    10. Mai 2018 um 21:35 Uhr

Es verursacht Javascript-Fehler und beendet die Ausführung des Javascript-Blocks, der den Fehler enthält.

Sie könnten jedoch eine Dummy-Funktion definieren, die keine Operation ist, wenn Firebug nicht aktiv ist:

if(typeof console === "undefined") {
    console = { log: function() { } };
}

Wenn Sie andere Methoden als verwenden logmüssten Sie diese auch ausdrücken.

  • Vielen Dank. Das sieht nach einem netten Workaround aus. Mal sehen, ob ich es verstehe. Sie sagen, wenn die Konsole nicht definiert ist, setzen Sie die Konsole auf eine leere Funktion. Ich verstehe die Doppelpunktsyntax nach ‘log’ nicht. Was macht das und warum steht nach “console=” alles in geschweiften Klammern?

    – Charlie Kotter

    11. Juli 2009 um 17:30 Uhr

  • Die geschweiften Klammern definieren ein Objektliteral: developer.mozilla.org/en/Core_JavaScript_1.5_Guide/… und das “function() {}”-Bit definiert eine anonyme Funktion, die keine Argumente akzeptiert und nichts tut. (Es funktioniert immer noch, “console.log(foo)” mit einem Argument aufzurufen, da es JS egal ist, ob Sie eine Funktion mit zu vielen oder zu wenigen Argumenten aufrufen.)

    – Jason Creighton

    11. Juli 2009 um 17:37 Uhr

  • Verstanden. Danke auch für den Link.

    – Charlie Kotter

    11. Juli 2009 um 18:11 Uhr

  • Super Lösung Mann!! 🙂 Ich hatte gerade dieses Problem neulich. Meine Seite funktionierte nur in FF, wenn FireBug eingeschaltet war, und sie wurde bei bestimmten Aktionen im IE zufällig angehalten. Ich war wie WTF!?! Und dann wurde mir klar, dass ich die console.log-Aufrufe immer noch dort hatte und ich sie durchgehen und entfernen musste. Ich werde Ihre Lösung wahrscheinlich jetzt zu meiner Haupt-JS-Datei hinzufügen und muss mich nie wieder um dieses unglückliche Szenario kümmern.

    – Kyle Farris

    11. Juli 2009 um 19:42 Uhr

  • Ich habe ein kleines (getestetes) Projekt, das Ihnen dabei hilft, genau dies mit verschiedenen Konsolenmethoden in möglichst wenig Code zu tun. Es befindet sich hier: github.com/andyet/ConsoleDummy.js

    – Henrik Joreteg

    28. Januar 2011 um 23:17 Uhr

Wie andere bereits darauf hingewiesen haben, führt das Belassen zu Fehlern in einigen Browsern, aber diese Fehler können umgangen werden, indem einige Stubs eingefügt werden.

Ich würde sie jedoch nicht nur auskommentieren, sondern diese Zeilen direkt entfernen. Es scheint einfach schlampig zu sein, etwas anderes zu tun. Vielleicht bin ich pedantisch, aber ich denke nicht, dass “Produktionscode” überhaupt “Debug”-Code enthalten sollte, nicht einmal in kommentierter Form. Wenn Sie überhaupt Kommentare hinterlassen, sollten diese Kommentare beschreiben, was der Code macht, oder die Gründe dafür – nicht Blöcke von deaktiviertem Code. (Obwohl die meisten Kommentare automatisch durch Ihren Minimierungsprozess entfernt werden sollten. Sie minimieren doch, oder?)

Außerdem kann ich mich in mehreren Jahren der Arbeit mit JavaScript nicht erinnern, jemals zu einer Funktion zurückgekehrt zu sein und gesagt zu haben: “Mensch, ich wünschte, ich hätte diese console.logs hier gelassen!” Wenn ich mit der Arbeit an einer Funktion “fertig” bin und später darauf zurückkommen muss, komme ich im Allgemeinen zurück, um ein anderes Problem zu beheben. Was auch immer dieses neue Problem ist, wenn die console.logs aus einer früheren Arbeitsrunde hilfreich gewesen wären, dann hätte ich das Problem beim ersten Mal entdeckt. Mit anderen Worten, wenn ich auf etwas zurückkomme, benötige ich wahrscheinlich nicht genau dieselben Debug-Informationen wie bei früheren Gelegenheiten.

Nur meine zwei Cent… Viel Glück!

  • Das Problem tritt oft während des Produktionszyklus auf, wenn etwas debuggt oder getestet wird, und Leute außerhalb des Entwicklungsteams sehen, die keine Entwicklungskonsole haben. Meine persönliche Vorliebe ist es, die App nicht sterben zu lassen, damit wir keine Anrufe erhalten wie „Ihr neuer Code bringt mir nichts“.

    – Dimitar Christoff

    30. Juni 2010 um 20:06 Uhr

  • Permanente Debug-Zeilen sind fantastisch. Sie bedeuten, dass Sie sich oft nicht nach der Quelle eines Fehlers umsehen müssen, sondern sofort sehen können, was passiert. Es gibt viele Codeabschnitte, in denen eine Protokollanweisung keinen signifikanten Leistungsunterschied bewirkt.

    – Casebash

    11. Januar 2013 um 6:43 Uhr

  • Eine gute Protokollierung sollte für eine Vielzahl von Zwecken nützlich sein. Zu sagen, dass log () -Anweisungen nur zum Debuggen eines Problems nützlich waren, erinnert mich an die Java-Protokollierung von Leuten, die nicht wissen, wie man eine ordnungsgemäße Protokollierung schreibt.

    –Thomas W

    2. Mai 2013 um 3:48 Uhr

  • Kurz gesagt: Protokollieren Sie wichtige (allgemeine) Entscheidungen und die Ereignisbehandlung, damit das Geschäft, die Benutzeroberfläche auf hoher Ebene und die Behandlung wichtiger Ereignisse verfolgt werden können. Diese sind für die Entwicklung der Anwendung auf Dauer wertvoll. Das Protokollieren von ‘Eintritt in Methode A’, ‘Verlassen von Methode A’, ‘param1 77’ ist OTOH keine gute Protokollierung.

    –Thomas W

    2. Mai 2013 um 3:50 Uhr

Wenn Sie über ein Bereitstellungsskript verfügen, können Sie damit die Aufrufe von console.log entfernen (und die Datei minimieren).

Wenn Sie schon dabei sind, können Sie Ihr JS durch JSLint werfen und die Verstöße zur Überprüfung protokollieren (oder die Bereitstellung verhindern).

Dies ist ein hervorragendes Beispiel dafür, warum Sie Ihre Bereitstellung automatisieren möchten. Wenn Ihr Prozess es Ihnen erlaubt, eine js-Datei mit console.logs darin zu veröffentlichen, müssen Sie irgendwann Wille Tu es.

Benutzer-Avatar
Henrik Joreteg

Meines Wissens nach gibt es keine kürzere Methode zum Stubben console.log als die folgenden 45 Zeichen:

window.console||(console={log:function(){}});

Das ist die erste von 3 verschiedenen Versionen, je nachdem, welche Konsolenmethoden Sie verwenden möchten, alle sind winzig und alle wurden in IE6+ und modernen Browsern getestet.

Die anderen beiden Versionen decken verschiedene andere Konsolenmethoden ab. Eine behandelt die vier Grundlagen und die andere alle bekannten Konsolenmethoden für Firebug und Webkit. Auch hier in den kleinstmöglichen Dateigrößen.

Dieses Projekt ist auf github: https://github.com/andyet/ConsoleDummy.js

Wenn Ihnen eine Möglichkeit einfällt, den Code weiter zu minimieren, sind Beiträge willkommen.

— BEARBEITEN — 16. Mai 2012

Ich habe seitdem diesen Code verbessert. Es ist immer noch winzig, fügt aber die Möglichkeit hinzu, die Konsolenausgabe ein- und auszuschalten: https://github.com/HenrikJoreteg/andlog

Es war in der Changelog Show vorgestellt

Benutzer-Avatar
Christoph

Sie sollten zumindest einen Dummy erstellen console.log Wenn das Objekt nicht vorhanden ist, wird Ihr Code keine Fehler auf den Computern der Benutzer ausgeben, ohne dass Firebug installiert ist.

Eine andere Möglichkeit wäre, das Logging nur im ‘Debug Mode’ auszulösen, also wenn ein bestimmtes Flag gesetzt ist:

if(_debug) console.log('foo');
_debug && console.log('foo');

  • Stimmen Sie Cristoph zu, für Safari wird es kein Problem sein, aber in anderen Browsern werden Fehler ausgegeben und möglicherweise wird Javascript angehalten, um fortzufahren. Generell keine gute Idee…

    – Sinan

    11. Juli 2009 um 17:22 Uhr


Hoffe, es hilft jemandem – ich habe vor einiger Zeit einen Wrapper dafür geschrieben, der etwas flexibler ist als die akzeptierte Lösung.

Wenn Sie andere Methoden wie console.info usw. verwenden, können Sie den Effekt natürlich replizieren. Wenn Sie mit Ihrer Staging-Umgebung fertig sind, ändern Sie einfach den Standard-C.debug für die Produktion auf „false“ und Sie müssen keinen anderen Code ändern / Zeilen entfernen usw. Sehr einfach, später darauf zurückzukommen und zu debuggen.

var C = {
    // console wrapper
    debug: true, // global debug on|off
    quietDismiss: false, // may want to just drop, or alert instead
    log: function() {
        if (!C.debug) return false;

        if (typeof console == 'object' && typeof console.log != "undefined") {
            console.log.apply(this, arguments); 
        }
        else {
            if (!C.quietDismiss) {
                var result = "";
                for (var i = 0, l = arguments.length; i < l; i++)
                    result += arguments[i] + " ("+typeof arguments[i]+") ";

                alert(result);
            }
        }
    }
}; // end console wrapper.

// example data and object
var foo = "foo", bar = document.getElementById("divImage");
C.log(foo, bar);

// to surpress alerts on IE w/o a console:
C.quietDismiss = true;
C.log("this won't show if no console");

// to disable console completely everywhere:
C.debug = false;
C.log("this won't show ever");

  • Stimmen Sie Cristoph zu, für Safari wird es kein Problem sein, aber in anderen Browsern werden Fehler ausgegeben und möglicherweise wird Javascript angehalten, um fortzufahren. Generell keine gute Idee…

    – Sinan

    11. Juli 2009 um 17:22 Uhr


Benutzer-Avatar
Nick Fuchs

das scheint bei mir zu funktionieren…

if (!window.console) {
    window.console = {
        log: function () {},
        group: function () {},
        error: function () {},
        warn: function () {},
        groupEnd: function () {}
    };
}

1119930cookie-checkSchlechte Idee, “console.log()”-Aufrufe in Ihrem Produktions-JavaScript-Code zu belassen?

Schlechte Idee, “console.log()”-Aufrufe in Ihrem Produktions-JavaScript-Code zu belassen?

Lesezeit: 7 Minuten

Benutzer-Avatar
Charlie Kotter

Ich habe eine Menge console.log() Aufrufe in meinem JavaScript.

Sollte ich sie auskommentieren, bevor ich sie in der Produktion bereitstelle?

Ich möchte sie einfach dort belassen, damit ich mir später nicht die Mühe machen muss, die Kommentare erneut hinzuzufügen, wenn ich noch mehr debuggen muss. Ist das eine schlechte Idee?

  • Für diejenigen, die nach der Angular-Version dieser Frage suchen: stackoverflow.com/questions/42307317/…

    – rmcsharry

    10. Mai 2018 um 21:35 Uhr

Es verursacht Javascript-Fehler und beendet die Ausführung des Javascript-Blocks, der den Fehler enthält.

Sie könnten jedoch eine Dummy-Funktion definieren, die keine Operation ist, wenn Firebug nicht aktiv ist:

if(typeof console === "undefined") {
    console = { log: function() { } };
}

Wenn Sie andere Methoden als verwenden logmüssten Sie diese auch ausdrücken.

  • Vielen Dank. Das sieht nach einem netten Workaround aus. Mal sehen, ob ich es verstehe. Sie sagen, wenn die Konsole nicht definiert ist, setzen Sie die Konsole auf eine leere Funktion. Ich verstehe die Doppelpunktsyntax nach ‘log’ nicht. Was macht das und warum steht nach “console=” alles in geschweiften Klammern?

    – Charlie Kotter

    11. Juli 2009 um 17:30 Uhr

  • Die geschweiften Klammern definieren ein Objektliteral: developer.mozilla.org/en/Core_JavaScript_1.5_Guide/… und das “function() {}”-Bit definiert eine anonyme Funktion, die keine Argumente akzeptiert und nichts tut. (Es funktioniert immer noch, “console.log(foo)” mit einem Argument aufzurufen, da es JS egal ist, ob Sie eine Funktion mit zu vielen oder zu wenigen Argumenten aufrufen.)

    – Jason Creighton

    11. Juli 2009 um 17:37 Uhr

  • Verstanden. Danke auch für den Link.

    – Charlie Kotter

    11. Juli 2009 um 18:11 Uhr

  • Super Lösung Mann!! 🙂 Ich hatte gerade dieses Problem neulich. Meine Seite funktionierte nur in FF, wenn FireBug eingeschaltet war, und sie wurde bei bestimmten Aktionen im IE zufällig angehalten. Ich war wie WTF!?! Und dann wurde mir klar, dass ich die console.log-Aufrufe immer noch dort hatte und ich sie durchgehen und entfernen musste. Ich werde Ihre Lösung wahrscheinlich jetzt zu meiner Haupt-JS-Datei hinzufügen und muss mich nie wieder um dieses unglückliche Szenario kümmern.

    – Kyle Farris

    11. Juli 2009 um 19:42 Uhr

  • Ich habe ein kleines (getestetes) Projekt, das Ihnen dabei hilft, genau dies mit verschiedenen Konsolenmethoden in möglichst wenig Code zu tun. Es befindet sich hier: github.com/andyet/ConsoleDummy.js

    – Henrik Joreteg

    28. Januar 2011 um 23:17 Uhr

Wie andere bereits darauf hingewiesen haben, führt das Belassen zu Fehlern in einigen Browsern, aber diese Fehler können umgangen werden, indem einige Stubs eingefügt werden.

Ich würde sie jedoch nicht nur auskommentieren, sondern diese Zeilen direkt entfernen. Es scheint einfach schlampig zu sein, etwas anderes zu tun. Vielleicht bin ich pedantisch, aber ich denke nicht, dass “Produktionscode” überhaupt “Debug”-Code enthalten sollte, nicht einmal in kommentierter Form. Wenn Sie überhaupt Kommentare hinterlassen, sollten diese Kommentare beschreiben, was der Code macht, oder die Gründe dafür – nicht Blöcke von deaktiviertem Code. (Obwohl die meisten Kommentare automatisch durch Ihren Minimierungsprozess entfernt werden sollten. Sie minimieren doch, oder?)

Außerdem kann ich mich in mehreren Jahren der Arbeit mit JavaScript nicht erinnern, jemals zu einer Funktion zurückgekehrt zu sein und gesagt zu haben: “Mensch, ich wünschte, ich hätte diese console.logs hier gelassen!” Wenn ich mit der Arbeit an einer Funktion “fertig” bin und später darauf zurückkommen muss, komme ich im Allgemeinen zurück, um ein anderes Problem zu beheben. Was auch immer dieses neue Problem ist, wenn die console.logs aus einer früheren Arbeitsrunde hilfreich gewesen wären, dann hätte ich das Problem beim ersten Mal entdeckt. Mit anderen Worten, wenn ich auf etwas zurückkomme, benötige ich wahrscheinlich nicht genau dieselben Debug-Informationen wie bei früheren Gelegenheiten.

Nur meine zwei Cent… Viel Glück!

  • Das Problem tritt oft während des Produktionszyklus auf, wenn etwas debuggt oder getestet wird, und Leute außerhalb des Entwicklungsteams sehen, die keine Entwicklungskonsole haben. Meine persönliche Vorliebe ist es, die App nicht sterben zu lassen, damit wir keine Anrufe erhalten wie „Ihr neuer Code bringt mir nichts“.

    – Dimitar Christoff

    30. Juni 2010 um 20:06 Uhr

  • Permanente Debug-Zeilen sind fantastisch. Sie bedeuten, dass Sie sich oft nicht nach der Quelle eines Fehlers umsehen müssen, sondern sofort sehen können, was passiert. Es gibt viele Codeabschnitte, in denen eine Protokollanweisung keinen signifikanten Leistungsunterschied bewirkt.

    – Casebash

    11. Januar 2013 um 6:43 Uhr

  • Eine gute Protokollierung sollte für eine Vielzahl von Zwecken nützlich sein. Zu sagen, dass log () -Anweisungen nur zum Debuggen eines Problems nützlich waren, erinnert mich an die Java-Protokollierung von Leuten, die nicht wissen, wie man eine ordnungsgemäße Protokollierung schreibt.

    –Thomas W

    2. Mai 2013 um 3:48 Uhr

  • Kurz gesagt: Protokollieren Sie wichtige (allgemeine) Entscheidungen und die Ereignisbehandlung, damit das Geschäft, die Benutzeroberfläche auf hoher Ebene und die Behandlung wichtiger Ereignisse verfolgt werden können. Diese sind für die Entwicklung der Anwendung auf Dauer wertvoll. Das Protokollieren von ‘Eintritt in Methode A’, ‘Verlassen von Methode A’, ‘param1 77’ ist OTOH keine gute Protokollierung.

    –Thomas W

    2. Mai 2013 um 3:50 Uhr

Wenn Sie über ein Bereitstellungsskript verfügen, können Sie damit die Aufrufe von console.log entfernen (und die Datei minimieren).

Wenn Sie schon dabei sind, können Sie Ihr JS durch JSLint werfen und die Verstöße zur Überprüfung protokollieren (oder die Bereitstellung verhindern).

Dies ist ein hervorragendes Beispiel dafür, warum Sie Ihre Bereitstellung automatisieren möchten. Wenn Ihr Prozess es Ihnen erlaubt, eine js-Datei mit console.logs darin zu veröffentlichen, müssen Sie irgendwann Wille Tu es.

Benutzer-Avatar
Henrik Joreteg

Meines Wissens nach gibt es keine kürzere Methode zum Stubben console.log als die folgenden 45 Zeichen:

window.console||(console={log:function(){}});

Das ist die erste von 3 verschiedenen Versionen, je nachdem, welche Konsolenmethoden Sie verwenden möchten, alle sind winzig und alle wurden in IE6+ und modernen Browsern getestet.

Die anderen beiden Versionen decken verschiedene andere Konsolenmethoden ab. Eine behandelt die vier Grundlagen und die andere alle bekannten Konsolenmethoden für Firebug und Webkit. Auch hier in den kleinstmöglichen Dateigrößen.

Dieses Projekt ist auf github: https://github.com/andyet/ConsoleDummy.js

Wenn Ihnen eine Möglichkeit einfällt, den Code weiter zu minimieren, sind Beiträge willkommen.

— BEARBEITEN — 16. Mai 2012

Ich habe seitdem diesen Code verbessert. Es ist immer noch winzig, fügt aber die Möglichkeit hinzu, die Konsolenausgabe ein- und auszuschalten: https://github.com/HenrikJoreteg/andlog

Es war in der Changelog Show vorgestellt

Benutzer-Avatar
Christoph

Sie sollten zumindest einen Dummy erstellen console.log Wenn das Objekt nicht vorhanden ist, wird Ihr Code keine Fehler auf den Computern der Benutzer ausgeben, ohne dass Firebug installiert ist.

Eine andere Möglichkeit wäre, das Logging nur im ‘Debug Mode’ auszulösen, also wenn ein bestimmtes Flag gesetzt ist:

if(_debug) console.log('foo');
_debug && console.log('foo');

  • Stimmen Sie Cristoph zu, für Safari wird es kein Problem sein, aber in anderen Browsern werden Fehler ausgegeben und möglicherweise wird Javascript angehalten, um fortzufahren. Generell keine gute Idee…

    – Sinan

    11. Juli 2009 um 17:22 Uhr


Hoffe, es hilft jemandem – ich habe vor einiger Zeit einen Wrapper dafür geschrieben, der etwas flexibler ist als die akzeptierte Lösung.

Wenn Sie andere Methoden wie console.info usw. verwenden, können Sie den Effekt natürlich replizieren. Wenn Sie mit Ihrer Staging-Umgebung fertig sind, ändern Sie einfach den Standard-C.debug für die Produktion auf „false“ und Sie müssen keinen anderen Code ändern / Zeilen entfernen usw. Sehr einfach, später darauf zurückzukommen und zu debuggen.

var C = {
    // console wrapper
    debug: true, // global debug on|off
    quietDismiss: false, // may want to just drop, or alert instead
    log: function() {
        if (!C.debug) return false;

        if (typeof console == 'object' && typeof console.log != "undefined") {
            console.log.apply(this, arguments); 
        }
        else {
            if (!C.quietDismiss) {
                var result = "";
                for (var i = 0, l = arguments.length; i < l; i++)
                    result += arguments[i] + " ("+typeof arguments[i]+") ";

                alert(result);
            }
        }
    }
}; // end console wrapper.

// example data and object
var foo = "foo", bar = document.getElementById("divImage");
C.log(foo, bar);

// to surpress alerts on IE w/o a console:
C.quietDismiss = true;
C.log("this won't show if no console");

// to disable console completely everywhere:
C.debug = false;
C.log("this won't show ever");

  • Stimmen Sie Cristoph zu, für Safari wird es kein Problem sein, aber in anderen Browsern werden Fehler ausgegeben und möglicherweise wird Javascript angehalten, um fortzufahren. Generell keine gute Idee…

    – Sinan

    11. Juli 2009 um 17:22 Uhr


Benutzer-Avatar
Nick Fuchs

das scheint bei mir zu funktionieren…

if (!window.console) {
    window.console = {
        log: function () {},
        group: function () {},
        error: function () {},
        warn: function () {},
        groupEnd: function () {}
    };
}

1119920cookie-checkSchlechte Idee, “console.log()”-Aufrufe in Ihrem Produktions-JavaScript-Code zu belassen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy