Remplacer la console.log (); pour la production [duplicate]

cette question a déjà une réponse ici:

  • comment désactiver rapidement et commodément toute console.enregistrer les déclarations dans mon code? 23 réponses

Je suis assez nouveau dans le développement de Javascript donc cela pourrait être une vraie question de débutant.

j'ai un sencha-touch application criblée de console.log(); à des fins de débogage.

j'ai crépitant faire tout mon temps de construction combinant. Il produit un app.debug.js pour le débogage ainsi qu'un app.min.js pour la production

maintenant je peux passer en revue tous mes fichiers de code à la recherche de console.log(); et l'effacer manuellement quand je suis prêt à aller en production, mais je me demande s'il y a un moyen de passer outre méthode.

En Gros, chaque fois que la méthode console.log(); est appelée, ne faites rien.

de cette façon, je peux mettre le fichier de code override dans ma configuration de production, et pas dans ma configuration de débogage.

est-ce possible?

93
demandé sur Charles 2011-08-12 19:40:07

13 réponses

mettez ceci en haut du fichier:

var console = {};
console.log = function(){};

pour certains navigateurs et mini-navigateurs, vous devrez peut-être appliquer ceci sur l'objet window.

window.console = console;
184
répondu Neal 2014-05-10 16:38:52

ou si vous voulez simplement redéfinir le comportement de la console (pour ajouter des logs par exemple)) Vous pouvez faire quelque chose comme ça:

// define a new console
var console=(function(oldCons){
    return {
        log: function(text){
            oldCons.log(text);
            // Your code
        },
        info: function (text) {
            oldCons.info(text);
            // Your code
        },
        warn: function (text) {
            oldCons.warn(text);
            // Your code
        },
        error: function (text) {
            oldCons.error(text);
            // Your code
        }
    };
}(window.console));

//Then redefine the old console
window.console = console;
35
répondu Ludovic Feltz 2016-08-09 14:48:11

il serait super utile de pouvoir basculer la journalisation dans la construction de production. Le code ci-dessous éteint l'enregistreur par défaut.

quand j'ai besoin de voir les logs, je tape debug(true) dans la console.

var consoleHolder = console;
function debug(bool){
    if(!bool){
        consoleHolder = console;
        console = {};
        Object.keys(consoleHolder).forEach(function(key){
            console[key] = function(){};
        })
    }else{
        console = consoleHolder;
    }
}
debug(false);

pour être complet, cela dépasse toutes les méthodes de la console, pas seulement console.log .

30
répondu posit labs 2017-11-11 16:32:56
console.log = function(){};

L'annulent comme n'importe quelle autre chose.

8
répondu Zirak 2011-08-12 15:43:31

j'utilise quelque chose de similaire à ce que posit labs fait. Enregistrez la console dans une fermeture et vous avez tout dans une fonction portable.

var GlobalDebug = (function () {
    var savedConsole = console;
    return function(debugOn,suppressAll){
        var suppress = suppressAll || false;
        if (debugOn === false) {
            console = {};
            console.log = function () { };
            if(suppress) {
                console.info = function () { };
                console.warn = function () { };
                console.error = function () { };
            } else {
                console.info = savedConsole.info;
                console.warn = savedConsole.warn;
                console.error = savedConsole.error;              
            }
        } else {
            console = savedConsole;
        }
    }
})();

faites simplement globalDebug(false) pour désactiver les messages log ou globalDebug(false,true) pour supprimer tous les messages de la console.

6
répondu Ryan 2014-02-14 21:10:45

je recommande d'utiliser: https://github.com/sunnykgupta/jsLogger

Dispose:

  1. il surpasse en toute sécurité la console.journal.
  2. prend soin si la console n'est pas disponible (oh oui, vous devez prendre en compte cela aussi.)
  3. stocke tous les journaux (même s'ils sont supprimés) pour une récupération ultérieure.
  4. Poignées majeur fonctions de la console comme log , warn , error , info .

peut faire l'objet de modifications et sera mis à jour à chaque nouvelle suggestion.

Avertissement: je suis l'auteur du plugin.

5
répondu Sunny R Gupta 2014-11-07 08:13:34

vous pouvez également utiliser regex pour supprimer toute la console.enregistrez les appels dans votre code s'ils ne sont plus nécessaires. N'importe quel IDE décent vous permettra de rechercher et de remplacer ceux-ci à travers un projet entier, et vous permettra de prévisualiser les correspondances avant de commettre le changement.

\s*console\.log\([^)]+\);
4
répondu Pappa 2013-10-16 21:06:33

n'oubliez pas qu'avec cette méthode, chaque console.log call fera quand même un appel à une fonction (vide) provoquant des frais généraux, s'il y a 100 console.log commandes, vous faites encore 100 appels à une fonction vierge.

Je ne suis pas sûr de combien cela causerait des frais généraux, mais il y en aura quelques-uns, il serait préférable d'avoir un drapeau pour activer le débogage puis d'utiliser quelque chose comme:

var debug=true; if (debug) console.log('blah')
3
répondu Kayem 2011-09-08 13:27:14

il n'y a aucune raison de laisser toute cette console.journal tous les dessus de votre projet en prod de l'environnement... Si vous voulez le faire correctement, ajoutez UglifyJS2 à votre processus de déploiement en utilisant l'option "drop_console".

3
répondu neiker 2014-03-06 21:00:00

après avoir lu beaucoup de messages, j'ai fait ma propre solution comme suit:

SCRIPT:

function extendConsole() {
    "use strict";
    try {
        var disabledConsoles = {};

        console.enable = function (level, enabled) {
            // Prevent errors in browsers without console[level]
            if (window.console === 'undefined' || !window.console || window.console === null) {
                window.console = {};
            }
            if (window.console[level] === 'undefined' || !window.console[level] || window.console[level] == null) {
                window.console[level] = function() {};
            }

            if (enabled) {
                if (disabledConsoles[level]) {
                    window.console[level] = disabledConsoles[level];
                }
                console.info("console." + level + "() was enabled.");
            } else {
                disabledConsoles[level] = window.console[level];
                window.console[level] = function () { };
                console.info("console." + level + "() was disabled.");
            }
        };
    } catch (exception) {
        console.error("extendConsole() threw an exception.");
        console.debug(exception);
    }
}

UTILISATION:

extendConsole();
console.enable("debug", window.debugMode);

exemple:

http://jsfiddle.net/rodolphobrock/2rzxb5bo/10 /

2
répondu Rodolpho Brock 2014-12-12 17:37:41

ceci va surcharger la console.log function quand l'url ne contient pas localhost. Vous pouvez remplacer le localhost par vos propres paramètres de développement.

// overriding console.log in production
if(window.location.host.indexOf('localhost:9000') < 0) {
    console.log = function(){};
}
2
répondu vinesh 2015-04-19 05:56:46

vous pouvez regarder dans UglifyJS : http://jstarrdewar.com/blog/2013/02/28/use-uglify-to-automatically-strip-debug-messages-from-your-javascript / , https://github.com/mishoo/UglifyJS Je n'ai pas encore essayé.

citant,

 if (typeof DEBUG === 'undefined') DEBUG = true; // will be removed

 function doSomethingCool() {
     DEBUG && console.log("something cool just happened"); // will be removed }

...La ligne de message de journal sera supprimée par le démultiplicateur de code mort D'Uglify (puisqu'il effacera toute condition qui évaluera toujours de faux.) Il en sera de cette première conditionnelle. Mais quand vous testez comme code non compressé, le débogage commencera Non défini, le premier le conditionnel le positionnera à true, et toute votre console.journal (le) des messages va travailler.

1
répondu osa 2013-10-16 20:34:34

voici ce que j'ai fait

    var domainNames =["fiddle.jshell.net"]; // we replace this by our production domain.

var logger = {
    force:false,
    original:null,
    log:function(obj)
    {
        var hostName = window.location.hostname;
        if(domainNames.indexOf(hostName) > -1)
        {
            if(window.myLogger.force === true)
            {
                window.myLogger.original.apply(this,arguments);
            }
        }else {
            window.myLogger.original.apply(this,arguments);
        }
    },
    forceLogging:function(force){
        window.myLogger.force = force;
    },
    original:function(){
        return window.myLogger.original;
    },
    init:function(){
        window.myLogger.original = console.log;
        console.log = window.myLogger.log;
    }
}

window.myLogger = logger;
console.log("this should print like normal");
window.myLogger.init();
console.log("this should not print");
window.myLogger.forceLogging(true);
console.log("this should print now");

a également publié à ce sujet ici. http://bhavinsurela.com/naive-way-of-overriding-console-log /

1
répondu Bhavin 2015-01-07 22:40:33