Stefan Profanter
Stefan Profanter

Reputation: 6866

javascript: console log use parent scope

Is it possible using some javascript trickery to tell console.log which line number it should output?

Suppose, we the following simple example:

function Logger () {
    this.debug = function(msg) {
        // do some stuff with msg
        console.log(msg);
    };
}

var log = new Logger();
log.debug("Hello");

If you open the page, Chrome shows up this:

enter image description here

This indicates that the message was logged at main.js:4 but what I really want is that it shows main.js:9. Because line 9 is where the logger was called. For this simple case it doesn't make much difference, but when the Logger is in a separate file, it always shows logger.js instead of the class which called the logger.

The Logger class should do some additional stuff with the logged message (e.g. sending it to the server), thus I can't just use this.debug = console.log.

EDIT:

There are already some similar questions, but all of them just add an additional line to the output, which isn't clickable to jump to the corresponding line:

Upvotes: 8

Views: 2677

Answers (2)

helm100
helm100

Reputation: 248

Another possibility, though maybe not the most elegant/concise, is passing the log function so scope is preserved:

function Logger () {
    this.debug = function(msg, logFunction) {
        // do some stuff with msg
        logFunction(msg);
    };
}

var log = new Logger();
log.debug("Hello", (msg) => console.log(msg));

Upvotes: 0

William Barbosa
William Barbosa

Reputation: 5005

The first thing that comes to my mind is creating a new Error object to get the stack trace and then find the line that called your method, like this:

function Logger () {
    this.debug = function(msg) {
        // do some stuff with msg

        //TODO: document this line
        var callerLine = new Error().stack.split('\n')[2];
        console.log(msg, callerLine);
    };
}

var log = new Logger();
log.debug("Hello");

Basically I'm splitting the error's stack in each newline and ignoring the first and second lines (The error message and your own method in the stack, respectively).

Upvotes: 5

Related Questions