2013-08-23 59 views
7

我有以下代碼:是否可以將日期/時間綁定到控制檯日誌?

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

其中一期工程發現,當我想記錄的東西與[DEBUG]前置到控制檯。 現在我想的日期/時間添加到日誌和我嘗試這樣做:

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

這顯然是行不通的,因爲它總是記錄同一時間(該.bind被稱爲時間)。

是否有任何登錄每個當前時間爲做到這一點登錄沒有方式(使用.bind):

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

因爲上面的方法顯示我調用console.log.apply的行和而不是調用myLog的行。

+0

你可以提取它從'錯誤稱爲行()。stack' – copy

+0

@copy這就是我已經在做......但是這並不允許你在控制檯中點擊它以訪問源文件中的行 – Neal

回答

24

是的。 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) 

這工作,因爲toString叫上timestamp(而且,事實上,一切)每次console.log被調用。

我們覆蓋默認toString方法,並用時間戳替換它(顯然,您可以將輸出更改爲任何您想要的)。

我選擇了上面的模式,因爲正如其他人已經注意到的(在SO聊天中),您可以輕鬆地擴展DEBUG對象來執行其他操作。

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

我認爲如果你直接使用'toString'方法直接傳遞一個對象就可以簡化代碼到函數:'console.log.bind(console,{toString:function(){...}})'。無需創建'DEBUG'或空功能。好主意,但! –

+0

@FelixKling不完全。這是這樣的結果:http://jsfiddle.net/SwFJg/2/ – Shmiddty

+1

我明白了,有道理。至少在Firefox中,您可以將評估強制爲一個字符串:http://jsfiddle.net/fkling/SwFJg/4/。雖然Chrome也支持此功能,但它只顯示「對象」。請注意,您的解決方案似乎不適用於Firefox,但如果您強制執行字符串評估,則它會:http://jsfiddle.net/fkling/SwFJg/5/。 –

2

我認爲這是你在找什麼,這是簡單的

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

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

這隻會記錄如果你只傳遞一件事情給控制檯日誌。如果你通過多件事情他們會丟失 – Neal

+0

如果你想支持多個參數,你可以在這裏使用我的解決方案: –

+0

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

相關問題