Переопределить console.log(); для производства

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

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

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

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

В принципе, всякий раз, когда вызывается метод console.log();, НЕ НИЧЕГО.

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

Возможно ли это?

Ответ 1

Поместите это в начало файла:

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

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

window.console = console;

Ответ 2

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

Когда мне нужно увидеть журналы, просто введите 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.

Ответ 3

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

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

Ответ 4

console.log = function(){};

Отмените это как любую другую вещь.

Ответ 5

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

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), чтобы удалить все сообщения консоли.

Ответ 6

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

Особенности:

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

Открыт для изменений и будет обновляться при появлении новых предложений.

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

Ответ 7

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

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

Ответ 8

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

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

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

Ответ 9

Нет никаких причин, чтобы позволить всему этому console.log по всему проекту в среде prod... Если вы хотите сделать это правильно, добавьте UglifyJS2 в ваш процесс развертывания с использованием опции "drop_console".

Ответ 10

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

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

ПРИМЕНЕНИЕ:

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

Пример:

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

Ответ 11

Это приведет к переопределению функции console.log, когда URL-адрес не содержит localhost. Вы можете заменить localhost своими собственными настройками разработки.

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

Ответ 12

Вы можете посмотреть 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 }

... Строка сообщения журнала будет удалена с помощью утилиты удаления Uglify dead-code (поскольку он будет стирать любое условие, которое всегда будет оцениваться ложный). Так будет и первое условие. Но когда вы тестируете несжатый код, DEBUG начнет undefined, первый conditional установит его в true, а все ваши сообщения console.log() будет работать.

Ответ 13

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

    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/