Как быстро и удобно отключить все операторы console.log в моем коде? - PullRequest
219 голосов
/ 01 августа 2009

Есть ли способ отключить все операторы console.log в моем коде JavaScript для тестирования?

Ответы [ 23 ]

372 голосов
/ 01 августа 2009

Переопределите функцию console.log в вашем скрипте.

console.log = function() {}

Вот и все, сообщений на консоль больше нет.

EDIT:

Расширение идеи Сида. Пользовательский регистратор, который вы можете использовать для включения / выключения регистрации в вашем коде.

Из моей консоли Firefox:

image

var logger = function()
{
    var oldConsoleLog = null;
    var pub = {};

    pub.enableLogger =  function enableLogger() 
                        {
                            if(oldConsoleLog == null)
                                return;

                            window['console']['log'] = oldConsoleLog;
                        };

    pub.disableLogger = function disableLogger()
                        {
                            oldConsoleLog = console.log;
                            window['console']['log'] = function() {};
                        };

    return pub;
}();

$(document).ready(
    function()
    {
        console.log('hello');

        logger.disableLogger();
        console.log('hi', 'hiya');
        console.log('this wont show up in console');

        logger.enableLogger();
        console.log('This will show up!');
    }
 );

Как использовать вышеуказанный «регистратор»? В вашем готовом событии вызовите logger.disableLogger, чтобы сообщения консоли не регистрировались. Добавьте вызовы к logger.enableLogger и logger.disableLogger внутри метода, для которого вы хотите записывать сообщения в консоль.

65 голосов
/ 01 августа 2009

Более подробно следующее:

var DEBUG = false;
if(!DEBUG){
    if(!window.console) window.console = {};
    var methods = ["log", "debug", "warn", "info"];
    for(var i=0;i<methods.length;i++){
        console[methods[i]] = function(){};
    }
}

Это обнулит общие методы в консоли, если они существуют, и они могут быть вызваны без ошибок и практически без снижения производительности. В случае браузера, такого как IE6 без консоли, будут созданы фиктивные методы для предотвращения ошибок. Конечно, в Firebug гораздо больше функций, таких как трассировка, профиль, время и т. Д. Их можно добавить в список, если вы используете их в своем коде.

Вы также можете проверить, есть ли у отладчика эти специальные методы или нет (т. Е. IE), и обнулить те, которые он не поддерживает:

if(window.console && !console.dir){
var methods = ["dir", "dirxml", "trace", "profile"]; //etc etc
    for(var i=0;i<methods.length;i++){
        console[methods[i]] = function(){};
    }
}
25 голосов
/ 01 августа 2009

Насколько я могу судить из документации , Firebug не предоставляет никакой переменной для переключения состояния отладки. Вместо этого оберните console.log () в обертку, которая его условно вызывает, т. Е .:

DEBUG = true; // set to false to disable debugging
function debug_log() {
    if ( DEBUG ) {
        console.log.apply(this, arguments);
    }
}

Чтобы не менять все существующие вызовы, вы можете использовать это вместо:

DEBUG = true; // set to false to disable debugging
old_console_log = console.log;
console.log = function() {
    if ( DEBUG ) {
        old_console_log.apply(this, arguments);
    }
}
14 голосов
/ 06 января 2015

Вы не должны!

Не рекомендуется перезаписывать встроенные функции.Также нет гарантии, что вы подавите все выходные данные, другие библиотеки, которые вы используете, могут отменить ваши изменения, и есть другие функции, которые могут записывать в консоль;.dir(), .warning(), .error(), .debug(), .assert() и т. Д.

Как некоторые предполагали, вы можете определить переменную DEBUG_MODE и вести лог условно.В зависимости от сложности и характера вашего кода, может быть хорошей идеей написать свой собственный объект / функцию регистратора, который будет обернут вокруг объекта консоли и имеет эту встроенную возможность.Это было бы правильным местом для работы с инструментарием .

Тем не менее, для целей "тестирования" вы можете написать tests вместо печати на консоль.Если вы не проводите никакого тестирования, и эти строки console.log() просто помогли написать ваш код, просто удалите их .

12 голосов
/ 22 сентября 2011

Я знаю, что вы спрашивали, как отключить console.log, но это может быть тем, что вам действительно нужно. Таким образом, вам не нужно явно включать или отключать консоль. Он просто предотвращает эти надоедливые ошибки консоли для людей, у которых она не открыта или не установлена.

if(typeof(console) === 'undefined') {
    var console = {};
    console.log = console.error = console.info = console.debug = console.warn = console.trace = console.dir = console.dirxml = console.group = console.groupEnd = console.time = console.timeEnd = console.assert = console.profile = function() {};
}
12 голосов
/ 10 сентября 2013

Я понимаю, что это старый пост, но он по-прежнему всплывает в верхней части результатов Google, так что вот более элегантное решение без jQuery, которое работает в последних версиях Chrome, FF и IE.

(function (original) {
    console.enableLogging = function () {
        console.log = original;
    };
    console.disableLogging = function () {
        console.log = function () {};
    };
})(console.log);
10 голосов
/ 17 декабря 2014

Просто измените флаг DEBUG, чтобы переопределить функцию console.log. Это должно сделать свое дело.

var DEBUG = false;
// ENABLE/DISABLE Console Logs
if(!DEBUG){
  console.log = function() {}
}
9 голосов
/ 08 мая 2015

Я удивлен, что из всех этих ответов никто не объединяет:

  • Нет запросов
  • Анонимная функция, не загрязняющая глобальное пространство имен
  • Обрабатывать случай, когда window.console не определена
  • Просто измените .log функцию консоли

Я бы пошел на это:

(function () {

    var debug = false

    if (debug === false) {
        if ( typeof(window.console) === 'undefined') { window.console = {}; }
        window.console.log = function () {};
    }
})()
8 голосов
/ 20 мая 2011

Если вы используете IE7, консоль не будет определена. Таким образом, более дружественная к IE версия будет:

if (typeof console == "undefined" || typeof console.log == "undefined") 
{
   var console = { log: function() {} }; 
}
7 голосов
/ 21 июля 2016

После того как я выполнил поиск этой проблемы, а также попробовал ее в своем приложении Cordova, я просто хочу предупредить каждого разработчика, чтобы Windows Phone не перезаписывал

    console.log

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

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

Просто перезаписать

    window.console.log 

если нужно.

Это работает в моем приложении:

   try {
        if (typeof(window.console) != "undefined") {
            window.console = {};
            window.console.log = function () {
            };
            window.console.info = function () {
            };
            window.console.warn = function () {
            };
            window.console.error = function () {
            };
        }

        if (typeof(alert) !== "undefined") {
            alert = function ()
            {

            }
        }

    } catch (ex) {

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...