2013-08-23 3 views
7

मैं निम्नलिखित कोड है। अब मैं लॉग में दिनांक/समय जोड़ना चाहते हैं और मैं इस कोशिश की:क्या कंसोल लॉग में दिनांक/समय बांधना संभव है?</p> <pre><code>var myLog = console.log.bind(console, '[DEBUG]'); </code></pre> <p>लगता है जब मैं कंसोल के लिए <code>[DEBUG]</code> साथ prepended बातें प्रवेश करना चाहते हैं काम करता है कौन सा:

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) 

यह काम करता है क्योंकि toStringtimestamp (और, वास्तव में, सब कुछ) हर बार console.log कहा जाता है पर कहा जाता है।

हम डिफ़ॉल्ट toString विधि को ओवरराइट करते हैं, और इसे एक समय टिकट के साथ प्रतिस्थापित करते हैं (जाहिर है आप आउटपुट को जो कुछ भी चाहते हैं उसे बदल सकते हैं)।

मैंने उपर्युक्त पैटर्न चुना क्योंकि, जैसा कि अन्य ने नोट किया है (एसओ चैट में), आप अन्य चीजों को करने के लिए आसानी से 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 (कंसोल, {toString: फ़ंक्शन() {...}})'। 'DEBUG' या खाली फ़ंक्शंस बनाने की कोई ज़रूरत नहीं है। अच्छा विचार हालांकि! –

+0

@ फ़ेलिक्सक्लिंग काफी नहीं है। इसका परिणाम यह है: http://jsfiddle.net/SwFJg/2/ – Shmiddty

+1

मुझे लगता है, समझ में आता है। कम से कम फ़ायरफ़ॉक्स में आप मूल्यांकन को एक स्ट्रिंग के रूप में लागू कर सकते हैं: http://jsfiddle.net/fkling/SwFJg/4/। हालांकि यह क्रोम में भी समर्थित है, यह सिर्फ 'ऑब्जेक्ट' दिखाता है। ध्यान दें कि आपका समाधान फ़ायरफ़ॉक्स में मेरे लिए काम नहीं कर रहा है, लेकिन यदि आप स्ट्रिंग मूल्यांकन लागू करते हैं, तो यह करता है: 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 –

संबंधित मुद्दे