Sending all Javascript console output into a DOM element

13,967

Solution 1

I found the accepted answer above helpful but it does have a couple issues as indicated in the comments:

1) doesn't work in Chrome because "former" does not take into account the this context no long being the console, the fix is to use the JavaScript apply method.

2) It does not account for multiple arguments being passed to console.log

I also wanted this to work without jQuery.

    var baseLogFunction = console.log;
    console.log = function(){
        baseLogFunction.apply(console, arguments);

        var args = Array.prototype.slice.call(arguments);
        for(var i=0;i<args.length;i++){
            var node = createLogNode(args[i]);
            document.querySelector("#mylog").appendChild(node);
        }

    }

    function createLogNode(message){
        var node = document.createElement("div");
        var textNode = document.createTextNode(message);
        node.appendChild(textNode);
        return node;
    }

    window.onerror = function(message, url, linenumber) {
        console.log("JavaScript error: " + message + " on line " +
            linenumber + " for " + url);
    }

Here is an updated working example with those changes. http://jsfiddle.net/eca7gcLz/

Solution 2

This is one approach for a quick solution:

Javascript

var former = console.log;
console.log = function(msg){
    former(msg);  //maintains existing logging via the console.
    $("#mylog").append("<div>" + msg + "</div>");
}

window.onerror = function(message, url, linenumber) {
    console.log("JavaScript error: " + message + " on line " + 
            linenumber + " for " + url);
}

HTML

<div id="mylog"></div>

Working Example http://jsfiddle.net/pUaYn/2/

Solution 3

Simple console.log redefinition, without error handling:

  const originalConsoleLog = console.log
  console.log = (...args) => {
    args.map(arg => document.querySelector("#mylog").innerHTML += arg + '<br>')
  }
  console.log = originalConsoleLog
Share:
13,967
John
Author by

John

Flash and web developer with experience in online advertising and marketing.

Updated on June 12, 2022

Comments

  • John
    John about 2 years

    How does one send all console output into a DOM element so it can be viewed without having to open any developer tools? I'd like to see all output, such as JS errors, console.log() output, etc.

    • SLaks
      SLaks about 11 years
    • apsillers
      apsillers about 11 years
      To get error messages (or at least parse errors), you can use window.onerror. Note that this doesn't get errors related to loading content (images, scripts, Ajax, etc.) Also, it might be not widely supported; I really have no idea.
  • John
    John about 11 years
    Thanks for the answer. I'm getting a Uncaught TypeError: Illegal invocation error in your fiddle when using Chrome. Any thoughts as to why?
  • Kevin Bowersox
    Kevin Bowersox about 11 years
    @John because it includes the line: va I wanted to throw an error to show you that it gets caught.
  • John
    John about 11 years
    In Chrome I get those errors, and nothing appears in the output. But in Firefox it works fine. I'll have to look into how the consoles are different. Thanks!
  • Ajax
    Ajax over 10 years
    And what about line numbers? Is there any chance to get them?
  • onmylemon
    onmylemon almost 10 years
    It is worth noting that this will not work where console.log has multiple arguments: console.log("string", [ "array" ], { object: true }); to get that working do former.apply(console, arguments);
  • Omar Tariq
    Omar Tariq almost 9 years
    "Uncaught TypeError: Illegal invocation" at line number 3
  • Niet the Dark Absol
    Niet the Dark Absol almost 9 years
    former = console.log detaches the function from its context. It's like doing function A() {this.doThing = function() {alert(this);}}; var b = new A(); b.doThing(); /* alerts A object */ var c = b.doThing(); c(); /* alerts window */