2013-08-23 12 views
7

Ho il codice seguente:È possibile associare una data/ora a un log della console?

var myLog = console.log.bind(console, '[DEBUG]'); 

Quali opere trovare quando voglio accedere cose anteporre con [DEBUG] alla console. Ora voglio aggiungere una data/ora per il log e ho provato questo:

var myLog = console.log.bind(console, '[DEBUG ' + (new Date) + ']'); 

che ovviamente non funziona perché sempre registra allo stesso tempo (il tempo che il .bind si chiamava).

C'è un modo (usando .bind) per registrare l'ora corrente su ogni login senza dover fare questo:

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); 
}; 

?

Perché il metodo sopra riportato indica la riga che è stata chiamata console.log.apply e non la riga che è stata chiamata myLog.

+0

Si potrebbe estrarre la linea dove è stato chiamato da 'Errore(). Stack' – copy

+0

@copy che è quello che ho Stava già facendo ... Ma questo non ti permette di cliccare su di esso nella console per arrivare alla riga nel file sorgente – Neal

risposta

24

Sì. 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) 

Questo funziona perché toString è chiamato timestamp (e, infatti, tutto) ogni volta che è chiamato console.log.

Sovrascriviamo il metodo predefinito toString e lo sostituiamo con un timestamp (ovviamente è possibile modificare l'output in qualsiasi modo).

Ho scelto lo schema sopra perché, come altri hanno notato (nella chat SO), è possibile estendere facilmente l'oggetto DEBUG per fare altre cose.

... 
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 
} 
... 
+0

Penso che potresti semplificare il codice se passi semplicemente un oggetto con un metodo 'toString' direttamente alla funzione: 'console.log.bind (console, {toString: function() {...}})'. Non è necessario creare 'DEBUG' o funzioni vuote. Buona idea però! –

+0

@FelixKling Non proprio. Questo è il risultato di questo: http://jsfiddle.net/SwFJg/2/ – Shmiddty

+1

Vedo, ha senso. Almeno in Firefox è possibile applicare la valutazione come stringa: http://jsfiddle.net/fkling/SwFJg/4/. Anche se questo è supportato anche in Chrome, mostra solo 'Object'. Si noti che la soluzione non sembra funzionare in Firefox per me, ma se si applica la valutazione delle stringhe, lo fa: http://jsfiddle.net/fkling/SwFJg/5/. –

2

Penso che questo è quello che stai cercando, che è semplice

console.logCopy = console.debug.bind(console); 

console.debug = function(data) 
{ 
    var currentDate = '[' + new Date().toUTCString() + '] '; 
    this.logCopy(currentDate, data); 
}; 
+2

Questo registra solo se si passa solo una cosa al log della console.Se si passano più cose si perdono – Neal

+0

Se si desidera supportare più parametri, è possibile utilizzare la mia soluzione qui: –

+0

http://stackoverflow.com/questions/18814221/adding-timestamps-to-all-console-messages/36887315 # 36887315 –

Problemi correlati