What happened to console.log in IE8?

JavascriptLoggingInternet Explorer-8Console

Javascript Problem Overview


According to this post it was in the beta, but it's not in the release?

Javascript Solutions


Solution 1 - Javascript

console.log is only available after you have opened the Developer Tools (F12 to toggle it open and closed). Funny thing is that after you've opened it, you can close it, then still post to it via console.log calls, and those will be seen when you reopen it. I'm thinking that is a bug of sorts, and may be fixed, but we shall see.

I'll probably just use something like this:

function trace(s) {
  if ('console' in self && 'log' in console) console.log(s)
  // the line below you might want to comment out, so it dies silent
  // but nice for seeing when the console is available or not.
  else alert(s)
}

and even simpler:

function trace(s) {
  try { console.log(s) } catch (e) { alert(s) }
}

Solution 2 - Javascript

Even better for fallback is this:


var alertFallback = true;
if (typeof console === "undefined" || typeof console.log === "undefined") {
console = {};
if (alertFallback) {
console.log = function(msg) {
alert(msg);
};
} else {
console.log = function() {};
}
}


Solution 3 - Javascript

This is my take on the various answers. I wanted to actually see the logged messages, even if I did not have the IE console open when they were fired, so I push them into a console.messages array that I create. I also added a function console.dump() to facilitate viewing the whole log. console.clear() will empty the message queue.

This solutions also "handles" the other Console methods (which I believe all originate from the Firebug Console API)

Finally, this solution is in the form of an IIFE, so it does not pollute the global scope. The fallback function argument is defined at the bottom of the code.

I just drop it in my master JS file which is included on every page, and forget about it.

(function (fallback) {    

	fallback = fallback || function () { };

	// function to trap most of the console functions from the FireBug Console API. 
	var trap = function () {
		// create an Array from the arguments Object           
		var args = Array.prototype.slice.call(arguments);
		// console.raw captures the raw args, without converting toString
		console.raw.push(args);
		var message = args.join(' ');
		console.messages.push(message);
		fallback(message);
	};

	// redefine console
	if (typeof console === 'undefined') {
		console = {
			messages: [],
			raw: [],
			dump: function() { return console.messages.join('\n'); },
			log: trap,
			debug: trap,
			info: trap,
			warn: trap,
			error: trap,
			assert: trap,
			clear: function() { 
				  console.messages.length = 0; 
				  console.raw.length = 0 ;
			},
			dir: trap,
			dirxml: trap,
			trace: trap,
			group: trap,
			groupCollapsed: trap,
			groupEnd: trap,
			time: trap,
			timeEnd: trap,
			timeStamp: trap,
			profile: trap,
			profileEnd: trap,
			count: trap,
			exception: trap,
			table: trap
		};
	}

})(null); // to define a fallback function, replace null with the name of the function (ex: alert)
Some extra info

The line var args = Array.prototype.slice.call(arguments); creates an Array from the arguments Object. This is required because arguments is not really an Array.

trap() is a default handler for any of the API functions. I pass the arguments to message so that you get a log of the arguments that were passed to any API call (not just console.log).

Edit

I added an extra array console.raw that captures the arguments exactly as passed to trap(). I realized that args.join(' ') was converting objects to the string "[object Object]" which may sometimes be undesirable. Thanks bfontaine for the suggestion.

Solution 4 - Javascript

It's worth noting that console.log in IE8 isn't a true Javascript function. It doesn't support the apply or call methods.

Solution 5 - Javascript

Assuming you don't care about a fallback to alert, here's an even more concise way to workaround Internet Explorer's shortcomings:

var console=console||{"log":function(){}};

Solution 6 - Javascript

I really like the approach posted by "orange80". It's elegant because you can set it once and forget it.

The other approaches require you to do something different (call something other than plain console.log() every time), which is just asking for trouble… I know that I'd eventually forget.

I've taken it a step further, by wrapping the code in a utility function that you can call once at the beginning of your javascript, anywhere as long as it's before any logging. (I'm installing this in my company's event data router product. It will help simplify the cross-browser design of its new admin interface.)

/**
 * Call once at beginning to ensure your app can safely call console.log() and
 * console.dir(), even on browsers that don't support it.  You may not get useful
 * logging on those browers, but at least you won't generate errors.
 * 
 * @param  alertFallback - if 'true', all logs become alerts, if necessary. 
 *   (not usually suitable for production)
 */
function fixConsole(alertFallback)
{    
	if (typeof console === "undefined")
	{
		console = {}; // define it if it doesn't exist already
	}
	if (typeof console.log === "undefined") 
	{
		if (alertFallback) { console.log = function(msg) { alert(msg); }; } 
		else { console.log = function() {}; }
	}
	if (typeof console.dir === "undefined") 
	{
		if (alertFallback) 
		{ 
			// THIS COULD BE IMPROVED… maybe list all the object properties?
			console.dir = function(obj) { alert("DIR: "+obj); }; 
		}
		else { console.dir = function() {}; }
	}
}

Solution 7 - Javascript

If you get "undefined" to all of your console.log calls, that probably means you still have an old firebuglite loaded (firebug.js). It will override all the valid functions of IE8's console.log even though they do exist. This is what happened to me anyway.

Check for other code overriding the console object.

Solution 8 - Javascript

The best solution for any browser that lack a console is:

// Avoid `console` errors in browsers that lack a console.
(function() {
    var method;
    var noop = function () {};
    var methods = [
        'assert', 'clear', 'count', 'debug', 'dir', 'dirxml', 'error',
        'exception', 'group', 'groupCollapsed', 'groupEnd', 'info', 'log',
        'markTimeline', 'profile', 'profileEnd', 'table', 'time', 'timeEnd',
        'timeStamp', 'trace', 'warn'
    ];
    var length = methods.length;
    var console = (window.console = window.console || {});

    while (length--) {
        method = methods[length];

        // Only stub undefined methods.
        if (!console[method]) {
            console[method] = noop;
        }
    }
}());

Solution 9 - Javascript

There are so many Answers. My solution for this was:

globalNamespace.globalArray = new Array();
if (typeof console === "undefined" || typeof console.log === "undefined") {
    console = {};
    console.log = function(message) {globalNamespace.globalArray.push(message)};   
}

In short, if console.log doesn't exists (or in this case, isn't opened) then store the log in a global namespace Array. This way, you're not pestered with millions of alerts and you can still view your logs with the developer console opened or closed.

Solution 10 - Javascript

Here is my "IE please don't crash"

typeof console=="undefined"&&(console={});typeof console.log=="undefined"&&(console.log=function(){});

Solution 11 - Javascript

if (window.console && 'function' === typeof window.console.log) {
window.console.log(o);
}

Solution 12 - Javascript

I found this on github:

// usage: log('inside coolFunc', this, arguments);
// paulirish.com/2009/log-a-lightweight-wrapper-for-consolelog/
window.log = function f() {
	log.history = log.history || [];
	log.history.push(arguments);
	if (this.console) {
		var args = arguments,
			newarr;
		args.callee = args.callee.caller;
		newarr = [].slice.call(args);
		if (typeof console.log === 'object') log.apply.call(console.log, console, newarr);
		else console.log.apply(console, newarr);
	}
};
 
// make it safe to use console.log always
(function(a) {
	function b() {}
	for (var c = "assert,count,debug,dir,dirxml,error,exception,group,groupCollapsed,groupEnd,info,log,markTimeline,profile,profileEnd,time,timeEnd,trace,warn".split(","), d; !! (d = c.pop());) {
		a[d] = a[d] || b;
	}
})(function() {
	try {
		console.log();
		return window.console;
	} catch(a) {
		return (window.console = {});
	}
} ());

Solution 13 - Javascript

I'm using Walter's approach from above (see: https://stackoverflow.com/a/14246240/3076102)

I mix in a solution I found here https://stackoverflow.com/a/7967670 to properly show Objects.

This means the trap function becomes:

function trap(){
    if(debugging){
        // create an Array from the arguments Object           
        var args = Array.prototype.slice.call(arguments);
        // console.raw captures the raw args, without converting toString
        console.raw.push(args);
        var index;
        for (index = 0; index < args.length; ++index) {
            //fix for objects
            if(typeof args[index] === 'object'){ 
                args[index] = JSON.stringify(args[index],null,'\t').replace(/\n/g,'<br>').replace(/\t/g,'&nbsp;&nbsp;&nbsp;');
            }
        }
        var message = args.join(' ');
        console.messages.push(message);
        // instead of a fallback function we use the next few lines to output logs
        // at the bottom of the page with jQuery
        if($){
            if($('#_console_log').length == 0) $('body').append($('<div />').attr('id', '_console_log'));
            $('#_console_log').append(message).append($('<br />'));
        }
    }
} 

I hope this is helpful:-)

Solution 14 - Javascript

I like this method (using jquery's doc ready)... it lets you use console even in ie... only catch is that you need to reload the page if you open ie's dev tools after the page loads...

it could be slicker by accounting for all the functions, but I only use log so this is what I do.

//one last double check against stray console.logs
$(document).ready(function (){
	try {
		console.log('testing for console in itcutils');
	} catch (e) {
		window.console = new (function (){ this.log = function (val) {
			//do nothing
		}})();
	}
});

Solution 15 - Javascript

Here is a version that will log to the console when the developer tools are open and not when they are closed.

(function(window) {

   var console = {};
   console.log = function() {
      if (window.console && (typeof window.console.log === 'function' || typeof window.console.log === 'object')) {
         window.console.log.apply(window, arguments);
      }
   }

   // Rest of your application here

})(window)

Solution 16 - Javascript

Make your own console in html .... ;-) This can be imprved but you can start with :

if (typeof console == "undefined" || typeof console.log === "undefined") {
    var oDiv=document.createElement("div");
    var attr = document.createAttribute('id'); attr.value = 'html-console';
    oDiv.setAttributeNode(attr);


    var style= document.createAttribute('style');
    style.value = "overflow: auto; color: red; position: fixed; bottom:0; background-color: black; height: 200px; width: 100%; filter: alpha(opacity=80);";
    oDiv.setAttributeNode(style);

    var t = document.createElement("h3");
    var tcontent = document.createTextNode('console');
    t.appendChild(tcontent);
    oDiv.appendChild(t);

    document.body.appendChild(oDiv);
    var htmlConsole = document.getElementById('html-console');
    window.console = {
        log: function(message) {
            var p = document.createElement("p");
            var content = document.createTextNode(message.toString());
            p.appendChild(content);
            htmlConsole.appendChild(p);
        }
    };
}

Solution 17 - Javascript

It works in IE8. Open IE8's Developer Tools by hitting F12.

>>console.log('test')
LOG: test

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionleeand00View Question on Stackoverflow
Solution 1 - JavascriptMister LuckyView Answer on Stackoverflow
Solution 2 - JavascriptjpswainView Answer on Stackoverflow
Solution 3 - JavascriptWalter StaboszView Answer on Stackoverflow
Solution 4 - JavascriptJames WheareView Answer on Stackoverflow
Solution 5 - JavascriptLeif WicklandView Answer on Stackoverflow
Solution 6 - JavascriptChris JanickiView Answer on Stackoverflow
Solution 7 - Javascriptuser168290View Answer on Stackoverflow
Solution 8 - JavascriptVinícius MoraesView Answer on Stackoverflow
Solution 9 - JavascriptcalcazarView Answer on Stackoverflow
Solution 10 - JavascriptBrunoLMView Answer on Stackoverflow
Solution 11 - JavascriptBalázs NémethView Answer on Stackoverflow
Solution 12 - JavascriptSam JonesView Answer on Stackoverflow
Solution 13 - JavascriptRaymond ElferinkView Answer on Stackoverflow
Solution 14 - Javascriptuser3560902View Answer on Stackoverflow
Solution 15 - JavascriptGeorge ReithView Answer on Stackoverflow
Solution 16 - JavascriptAlexandre AssouadView Answer on Stackoverflow
Solution 17 - JavascriptKonstantin TarkusView Answer on Stackoverflow