Ответ 1
Поместите это в начало файла:
var console = {};
console.log = function(){};
Для некоторых браузеров и minifiers вам может потребоваться применить это к объекту window.
window.console = console;
Я новичок в разработке Javascript, поэтому этот вопрос может быть настоящим новичком.
У меня есть sencha-touch приложение, пронизанное console.log();
для целей отладки.
У меня есть chirpy все мое время сборки сборки. Он выводит app.debug.js
для отладки, а также app.min.js
для производства
Теперь я мог бы просматривать все мои файлы кода, ищущие console.log();
, и удалять их вручную, когда я готов к производству, но мне интересно, есть ли способ переопределить этот метод.
В принципе, всякий раз, когда вызывается метод console.log();
, НЕ НИЧЕГО.
Таким образом, я могу поместить файл переопределения кода в свой конфигурационный файл и НЕ в конфигурацию отладки.
Возможно ли это?
Поместите это в начало файла:
var console = {};
console.log = function(){};
Для некоторых браузеров и minifiers вам может потребоваться применить это к объекту window.
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
.
Или если вы просто хотите переопределить поведение консоли (например, для добавления журналов) Вы можете сделать что-то вроде этого:
// 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;
console.log = function(){};
Отмените это как любую другую вещь.
Я использую что-то похожее на то, что делают лабораторные лаборатории. Сохраните консоль в закрытии, и у вас есть все в одной переносной функции.
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
Особенности:
log
, warn
, error
, info
.Открыт для изменений и будет обновляться при появлении новых предложений.
Отказ от ответственности: Я являюсь автором плагина.
Вы также можете использовать регулярное выражение для удаления всех вызовов console.log() в коде, если они больше не требуются. Любая достойная среда IDE позволит вам искать и заменять их по всему проекту и разрешать просмотр матчей перед выполнением изменения.
\s*console\.log\([^)]+\);
Просто помните, что с помощью этого метода каждый вызов console.log по-прежнему будет выполнять вызов (пустой) функции, вызывающей служебные данные, если есть 100 команд console.log, вы все равно выполняете 100 вызовов пустой функции.
Не уверен, сколько накладных расходов это вызовет, но будут некоторые, было бы предпочтительнее иметь флаг для отладки, а затем использовать что-то по строкам:
var debug=true; if (debug) console.log('blah')
Нет никаких причин, чтобы позволить всему этому console.log по всему проекту в среде prod... Если вы хотите сделать это правильно, добавьте UglifyJS2 в ваш процесс развертывания с использованием опции "drop_console".
После прочтения многих сообщений я сделал свое решение следующим образом:
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);
Пример:
Это приведет к переопределению функции console.log, когда 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 }
... Строка сообщения журнала будет удалена с помощью утилиты удаления Uglify dead-code (поскольку он будет стирать любое условие, которое всегда будет оцениваться ложный). Так будет и первое условие. Но когда вы тестируете несжатый код, DEBUG начнет undefined, первый conditional установит его в true, а все ваши сообщения console.log() будет работать.
Вот что я сделал
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/