2012-07-09 15 views
57

संभव डुप्लिकेट:
Intercept calls to console.log in Chrome
Can I extend the console object (for rerouting the logging) in javascript?जावास्क्रिप्ट console.log कैप्चरिंग?

जब मेरी जे एस एप्लिकेशन console.log लिए लिखते हैं, मैं इतना है कि मैं AJAX कि करने के लिए उत्पादन प्रवेश कर सकते हैं कि लॉग संदेश कैप्चर करना चाहते हैं सर्वर। मैं उसको कैसे करू?

लॉग को लिखने वाला कोड बाहरी सेवाओं से है, इसलिए मैं इसे सीधे अजाक्स नहीं कर सकता।

उत्तर

113

आप निम्नलिखित तरीके से जावास्क्रिप्ट कार्यों का अपहरण कर सकते हैं:

(function(){ 
    var oldLog = console.log; 
    console.log = function (message) { 
     // DO MESSAGE HERE. 
     oldLog.apply(console, arguments); 
    }; 
})(); 
  1. रेखा 1 आपके कार्य को बंद करने में लपेटता है ताकि अन्य कार्यों के पास oldLog (रखरखाव कारणों के लिए) तक सीधे पहुंच हो।
  2. लाइन 2 मूल विधि को कैप्चर करता है।
  3. लाइन 3 एक नया फ़ंक्शन बनाता है।
  4. लाइन 4 वह जगह है जहां आप अपने सर्वर पर message भेजते हैं।
  5. रेखा 5 मूल विधि का आह्वान करता है क्योंकि इसे मूल रूप से संभाला जाता था।

apply ताकि हम इसे मूल तर्कों का उपयोगconsole पर आह्वान कर सकते हैं प्रयोग किया जाता है। बस oldLog(message) पर कॉल करना विफल हो जाएगा क्योंकि logconsole के साथ इसके संबंध पर निर्भर करता है।


अद्यतन नीचे प्रति zzzzBov की टिप्पणी, IE9 console.log में वास्तव में एक समारोह इतना oldLog.apply विफल हो जाएगा नहीं है। अधिक जानकारी के लिए console.log.apply not working in IE9 देखें।

+1

[आपके कोड में IE में समस्याएं होंगी क्योंकि 'console.log' वास्तव में IE में 'फ़ंक्शन' उदाहरण नहीं है] (http://stackoverflow.com/questions/5538972/console-log-apply-not-working- इन-IE9)। – zzzzBov

+0

@zzzzBov दिलचस्प। मुझे लगता है कि 'console._oldLog = console.log असाइन करना; console._oldLog (संदेश); ​​'काम करेगा, लेकिन अगर' कंसोल 'स्वयं एक होस्टेड ऑब्जेक्ट है, तो स्टिक करने के लिए कोई बदलाव की गारंटी नहीं है। दुर्भाग्यवश, मेरे पास अब परीक्षण करने के लिए आईई नहीं है। –

+0

हाँ, आप अभी भी '_oldLog' को कॉल कर सकते हैं। 'oldLog = Function.prototype.bind.call (console.log, console)' IE9 + के लिए काम करता है, लेकिन फिर IE8 और नीचे के लिए 'Function.prototype.bind'' के लिए पॉलीफ़िल की आवश्यकता होती है। – zzzzBov

16

सरल:

function yourCustomLog(msg) { 
    //send msg via AJAX 
} 

window.console.log = yourCustomLog; 

आप पूरी console वस्तु ओवरराइड करने के लिए console.info, console.warn कब्जा करने के लिए चाहते हो सकता है और इस तरह के:

window.console = { 
    log = function(msg) {...}, 
    info = function(msg) {...}, 
    warn = function(msg) {...}, 
    //... 
} 
+0

आप window.console = {...} का उपयोग नहीं कर सकते क्योंकि window.console केवल पढ़ने-योग्य संपत्ति है! – Luillyfe

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