Переопределить консоль.log(); для производства [дубликат]


этот вопрос уже есть ответ здесь:

Я довольно новичок в разработке Javascript, поэтому это может быть настоящий вопрос новичка.

у меня есть приложение sencha-touch, пронизанное console.log(); для отладочные цели.

у меня есть щебетать делать все мое время сборки объединения. Он выводит app.debug.js для отладки, а также app.min.js для производства

теперь я мог бы пройти через все мои файлы кода ищет console.log(); и удалите его вручную, когда я буду готов перейти к производству, но мне интересно, есть ли способ переопределить метод.

в принципе, когда console.log(); метод называется, ничего не делать.

таким образом, я могу поставить код переопределения файл в моей производственной конфигурации, а не в моей конфигурации отладки.

это возможно?

13 93

13 ответов:

поставить это в верхней части файла:

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

для некоторых браузеров и minifiers, вам может понадобиться, чтобы применить это на объект window.

window.console = console;

или если вы просто хотите переопределить поведение консоли (например, для добавления журналов) Вы можете сделать что-то вроде этого:

// 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;

было бы очень полезно иметь возможность переключать ведение журнала в производственной сборке. Приведенный ниже код отключает регистратор по умолчанию.

когда мне нужно увидеть журналы, я просто набираю debug(true) в консоли.

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

чтобы быть тщательным, это переопределяет все методы консоли, а не только console.log.

console.log = function(){};

переопределить его, как и любую другую вещь.

Я использую что-то похожее на то, что делает posit labs. Сохранить консоль в закрытии и у вас есть все это в одном портативном функции.

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;
        }
    }
})();

просто сделайте globalDebug(false), чтобы отключить сообщения журнала или globalDebug (false, true), чтобы удалить все сообщения консоли.

Я бы рекомендовал использовать: https://github.com/sunnykgupta/jsLogger

характеристики:

  1. он спокойно отменяет консоль.бревно.
  2. заботится, если консоль недоступна (О да,вам тоже нужно учитывать это.)
  3. сохраняет все журналы (даже если они подавлены) для последующего извлечения.
  4. обрабатывает основные функции консоли, такие как log,warn,error, info.

открыт для изменений и будет обновляться всякий раз, когда появляются новые предложения.

отказ от ответственности: Я являюсь автором плагина.

вы также можете использовать регулярное выражение для удаления всей консоли.log () вызывает ваш код, если они больше не требуются. Любая приличная IDE позволит вам искать и заменять их по всему проекту, а также позволит вам просматривать совпадения перед фиксацией изменения.

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

просто помните, что с этим методом каждая консоль.вызов журнала по-прежнему будет выполнять вызов (пустой) функции, вызывающей накладные расходы, если есть консоль 100.команды журнала, вы все еще делаете 100 вызовов пустой функции.

Не уверен, сколько накладных расходов это вызовет, но будут некоторые, было бы предпочтительнее иметь флаг для включения отладки, а затем использовать что-то вроде:

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

нет никаких причин, чтобы позволить все это консоль.войдите на всем протяжении вашего проекта в прод среды... Если вы хотите сделать это на правильном пути, добавьте UglifyJS2 к процессу развертывания с помощью опции" drop_console".

прочитав много сообщений, я сделал свое собственное решение следующим образом:

сценарий:

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

использование:

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

пример:

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

это переопределит консоль.функция журнала, когда url-адрес не содержит localhost. Вы можете заменить localhost своими собственными настройками разработки.

// overriding console.log in production
if(window.location.host.indexOf('localhost:9000') < 0) {
    console.log = function(){};
}

Вы можете ознакомиться UglifyJS: http://jstarrdewar.com/blog/2013/02/28/use-uglify-to-automatically-strip-debug-messages-from-your-javascript/, https://github.com/mishoo/UglifyJS Я еще не пробовал.

цитирую:

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

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

...Линия сообщение будет удалено "мертвого" кода уродовать это смывка (так как он будет стирать любые условные, которые всегда будут оцениваться ложный.) Так будет и с первым условным. Но когда вы тестирования как несжатый код, отладка начнется с неопределенного, первый условно установить его в true, и все ваши консоли.сообщение журнала будет работать.

вот что я сделал

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

также написал об этом здесь. http://bhavinsurela.com/naive-way-of-overriding-console-log/