Is there any way to turn off all console.log
statements in my JavaScript code, for testing purposes?
I think that the easiest and most understandable method in 2020 is to just create a global function like log()
and you can pick one of the following methods:
const debugging = true;
function log(toLog) {
if (debugging) {
console.log(toLog);
}
}
function log(toLog) {
if (true) { // You could manually change it (Annoying, though)
console.log(toLog);
}
}
You could say that the downside of these features is that:
debugging
variable or the if statement in the second optionAnd my retorts to these statements is that this is the only method that won't completely remove the console
or console.log
function which I think is bad programming because other developers who are working on the website would have to realize that you ignorantly removed them. Also, you can't edit JavaScript source code in JavaScript, so if you really want something to just wipe all of those from the code you could use a minifier that minifies your code and removes all console.log
s. Now, the choice is yours, what will you do?
If you use Webpack you could use the Terser plugin to completely exclude the console.log
function calls.
This way you can have a clean production app package that will not expose unnecessary information but still have all this info in your debug build.
https://github.com/terser/terser#compress-options
drop_console (default: false) -- Pass true to discard calls to console.* functions. If you wish to drop a specific function call such as console.info and/or retain side effects from function arguments after dropping the function call then use pure_funcs instead.
minimizer: [
new TerserPlugin({
terserOptions: {
compress: {
pure_funcs: [ 'console.log' ]
}
}
}),
]
Alternatively you can use drop_console: true
to exclude all console calls.
You can use logeek, It allows you to control your log messages visibility. Here is how you do that:
<script src="bower_components/dist/logeek.js"></script>
logeek.show('security');
logeek('some message').at('copy'); //this won't be logged
logeek('other message').at('secturity'); //this would be logged
You can also logeek.show('nothing')
to totally disable every log message.
I wrote this:
//Make a copy of the old console.
var oldConsole = Object.assign({}, console);
//This function redefine the caller with the original one. (well, at least i expect this to work in chrome, not tested in others)
function setEnabled(bool) {
if (bool) {
//Rewrites the disable function with the original one.
console[this.name] = oldConsole[this.name];
//Make sure the setEnable will be callable from original one.
console[this.name].setEnabled = setEnabled;
} else {
//Rewrites the original.
var fn = function () {/*function disabled, to enable call console.fn.setEnabled(true)*/};
//Defines the name, to remember.
Object.defineProperty(fn, "name", {value: this.name});
//replace the original with the empty one.
console[this.name] = fn;
//set the enable function
console[this.name].setEnabled = setEnabled
}
}
Unfortunately it doesn't work on use strict mode.
So using console.fn.setEnabled = setEnabled
and then console.fn.setEnabled(false)
where fn
could be almost any console function.
For your case would be:
console.log.setEnabled = setEnabled;
console.log.setEnabled(false);
I wrote this too:
var FLAGS = {};
FLAGS.DEBUG = true;
FLAGS.INFO = false;
FLAGS.LOG = false;
//Adding dir, table, or other would put the setEnabled on the respective console functions.
function makeThemSwitchable(opt) {
var keysArr = Object.keys(opt);
//its better use this type of for.
for (var x = 0; x < keysArr.length; x++) {
var key = keysArr[x];
var lowerKey = key.toLowerCase();
//Only if the key exists
if (console[lowerKey]) {
//define the function
console[lowerKey].setEnabled = setEnabled;
//Make it enabled/disabled by key.
console[lowerKey].setEnabled(opt[key]);
}
}
}
//Put the set enabled function on the original console using the defined flags and set them.
makeThemSwitchable(FLAGS);
so then you just need to put in the FLAGS
the default value (before execute the above code), like FLAGS.LOG = false
and the log function would be disabled by default, and still you could enabled it calling console.log.setEnabled(true)