I have the following code:
var myLog = console.log.bind(console, '[DEBUG]');
Which works find when I want to log things prepended with [DEBUG]
to the console.
Now I want to add a date/time to the log and I tried this:
var myLog = console.log.bind(console, '[DEBUG ' + (new Date) + ']');
Which obviously does not work because it always logs the same time (the time that the .bind
was called).
Is there any way (using .bind
) to log the current time on each log without having to do this:
var myLog = function(){
var args = ['[DEBUG ' + (new Date) + ']'];
for(var i = 0; i < arguments.length; ++i) {
args.push(arguments[i]);
}
return console.log.apply(console, args);
};
?
Because the above method shows me the line that console.log.apply
was called and not the line that myLog
was called.
Yes. http://jsfiddle.net/SwFJg/6/
var DEBUG = (function(){
var timestamp = function(){};
timestamp.toString = function(){
return "[DEBUG " + (new Date).toLocaleTimeString() + "]";
};
return {
log: console.log.bind(console, '%s', timestamp)
}
})();
DEBUG.log("banana", {foo:'bar'}); //[DEBUG 2:43:21 PM] banana Object {foo: "bar"}
console.log("Peppercorn"); //Peppercorn
DEBUG.log("apple"); //[DEBUG 2:43:21 PM] apple
DEBUG.log("orange"); //[DEBUG 2:43:21 PM] orange
setTimeout(function(){
DEBUG.log("mango"); //[DEBUG 2:43:25 PM] mango
},3000)
This works because toString
is called on timestamp
(and, in fact, everything) each time console.log
is called.
We overwrite the default toString
method, and replace it with a time stamp (obviously you can change the output to whatever you want).
I chose the above pattern because, as others have noted (in SO chat), you can easily extend the DEBUG object to do other things.
...
return {
log: console.log.bind(console, '%s', timestamp),
error: console.error.bind(console, '%s', timestamp),
info: console.info.bind(console, '%s', timestamp),
warn: console.warn.bind(console, '%s', timestamp),
group: ...,
groupEnd: ...,
groupCollapsed: ... // etc
}
...