web-dev-qa-db-fra.com

Remplacez console.log (); pour la production

Je suis assez nouveau dans le développement Javascript, donc ça pourrait être une vraie question pour les débutants.

J'ai une application sencha-touch chargée de console.log(); à des fins de débogage.

J'ai gazouillis je fais tout mon temps de construction en le combinant. Il génère un app.debug.js Pour le débogage ainsi qu'un app.min.js Pour la production

Maintenant, je pourrais parcourir tous mes fichiers de code à la recherche de console.log(); et le supprimer manuellement lorsque je serai prêt à passer à la production, mais je me demande s'il existe un moyen de remplacer la méthode.

Fondamentalement, chaque fois que la méthode console.log(); est appelée, NE RIEN FAIRE.

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

Est-ce possible?

104
Chase Florell

Placez ceci en haut du fichier:

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

Pour certains navigateurs et minificateurs, vous devrez peut-être appliquer cela à l'objet window.

window.console = console;
202
Neal

Ou si vous voulez simplement redéfinir le comportement de la console (pour ajouter des journaux 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;
45
Ludovic Feltz

Il serait extrêmement utile de pouvoir basculer la journalisation dans la version de production. Le code ci-dessous désactive le consignateur par défaut.

Lorsque j'ai besoin de voir les journaux, je tape juste 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 remplace TOUTES les méthodes de la console, pas seulement console.log.

37
posit labs
console.log = function(){};

Remplacez-le comme n'importe quelle autre chose.

8
Zirak

J'utilise quelque chose de semblable à ce que fait les laboratoires de posologie. Enregistrer 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;
        }
    }
})();

Il suffit de faire globalDebug (false) pour désactiver les messages du journal ou globalDebug (false, true) pour supprimer tous les messages de la console.

6
Ryan

Je recommanderais d'utiliser: https://github.com/sunnykgupta/jsLogger

Caractéristiques:

  1. Il remplace en toute sécurité le fichier console.log.
  2. Prend soin de vous si la console n'est pas disponible (oh oui, vous devez aussi en tenir compte.)
  3. Stocke tous les journaux (même s'ils sont supprimés) pour une récupération ultérieure.
  4. Gère les principales fonctions de la console telles que log, warn, error, info.

Est ouvert aux modifications et sera mis à jour à chaque nouvelle suggestion.

Disclaimer: Je suis l'auteur du plugin.

5
Sunny R Gupta

Vous pouvez également utiliser regex pour supprimer tous les appels console.log () de votre code s'ils ne sont plus nécessaires. N'importe quel décent IDE vous permettra de rechercher et de remplacer ceux-ci dans tout un projet, et vous permettra de prévisualiser les correspondances avant de valider la modification.

\s*console\.log\([^)]+\);
4
Pappa

N'oubliez pas qu'avec cette méthode, chaque appel console.log continuera d'appeler une fonction (vide), ce qui entraînera une surcharge. S'il y a 100 commandes console.log, vous effectuez toujours 100 appels vers une fonction vierge.

Je ne sais pas combien de temps cela va occasionner, mais il y en aura, il serait préférable d’avoir un drapeau pour activer le débogage puis utiliser quelque chose comme:

var debug=true; if (debug) console.log('blah')
3
Kayem

Il n'y a aucune raison de laisser tout ce fichier console.log sur votre projet dans l'environnement de production ... Si vous voulez le faire de la bonne façon, ajoutez glifyJS2 à votre processus de déploiement en utilisant l'option "drop_console" .

3
neiker

Cela remplacera la fonction console.log lorsque l'URL ne contient pas localhost. Vous pouvez remplacer l'hôte local 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
vinesh

Après avoir lu beaucoup d'articles, j'ai créé 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
Rodolpho Brock

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 du journal sera supprimée par le suppresseur de code mort d'Uglify (puisqu'il effacera toutes les conditions qui seront toujours considérées comme fausses). Il en sera de même pour le premier conditionnel. Mais lorsque vous testez en tant que code non compressé, DEBUG commencera par être indéfini, le premier conditionnel le définira sur true et tous vos messages console.log () fonctionneront.

1
osa

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");

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

1
Bhavin