2013-08-23 12 views
7

Mam następujący kod:Czy można powiązać datę/godzinę z dziennikiem konsoli?

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

który działa znaleźć kiedy chcę rzeczy poprzedzane [DEBUG] do konsoli zalogować. Teraz chcę dodać datę/godzinę do dziennika i próbowałem to:

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

co oczywiście nie działa, ponieważ zawsze rejestruje ten sam czas (czas że .bind się nazywała).

Czy istnieje jakikolwiek sposób (za pomocą .bind) logować aktualny czas na każdym zalogować bez konieczności zrobić:

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

?

Ponieważ powyższa metoda pokazuje mi linię, która została wywołana console.log.apply i nie linii, która została wywołana myLog.

+0

Można wyodrębnić linii, w której została wywołana z 'Error(). Stack' – copy

+0

@copy to co ja już to robił ... Ale to nie pozwala ci na kliknięcie w konsolę, aby dostać się do wiersza w pliku źródłowym. – Neal

Odpowiedz

24

Tak. 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) 

To działa, ponieważ toString nazywa na timestamp (i, w rzeczywistości, wszystko) za każdym razem console.log nazywa.

Zastępujemy domyślną metodę toString i zastępujemy ją sygnaturą czasową (oczywiście można zmienić wyjście na dowolne).

Wybrałem powyższy wzór, ponieważ, jak zauważyli inni (w rozmowie SO), można łatwo rozszerzyć obiekt DEBUG, aby wykonać inne czynności.

... 
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

Myślę, że możesz uprościć kod, jeśli po prostu przekazujesz obiekt za pomocą metody 'toString' bezpośrednio do funkcji: 'console.log.bind (console, {toString: function() {...}})'. Nie trzeba tworzyć "DEBUG" ani pustych funkcji. Dobry pomysł! –

+0

@FelixKling Niezupełnie. Oto rezultat: http://jsfiddle.net/SwFJg/2/ – Shmiddty

+1

Rozumiem, ma sens. Przynajmniej w Firefoksie możesz wymusić ocenę w postaci ciągu: http://jsfiddle.net/fkling/SwFJg/4/. Chociaż jest to również obsługiwane w Chrome, po prostu pokazuje 'Object'. Zauważ, że twoje rozwiązanie nie działa dla mnie w Firefoksie, ale jeśli wymusisz ewaluację ciągów, to: http://jsfiddle.net/fkling/SwFJg/5/. –

2

myślę, że to jest to, czego szukasz, który jest prosty

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

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

Loguje się tylko wtedy, gdy przekazujesz tylko jedną rzecz do logu konsoli.Jeśli zdasz wiele rzeczy, które utracą – Neal

+0

Jeśli chcesz obsługiwać wiele parametrów, możesz użyć mojego rozwiązania tutaj: –

+0

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

Powiązane problemy