2011-11-03 242 views
12

我想在javascript中爲未捕獲的異常和瀏覽器警告編寫處理程序。所有的錯誤和警告都應該發送到服務器以供以後查看。有沒有在JavaScript中監聽控制檯事件的方法?

處理的異常可以被捕獲並與

console.error("Error: ..."); 

console.warn("Warning: ..."); 

所以他們都沒有問題,很容易登錄,如果他們是從javascript代碼,甚至更多,未處理的異常可能與抓稱爲這和平的代碼:

window.onerror = function(){ 
    // add to errors Stack trace etc. 
    }); 
} 

所以異常是相當cov但我堅持警告哪些瀏覽器發送到控制檯。例如安全或HTML驗證警告。下面的例子是從谷歌瀏覽器的控制檯採取

上的網頁https://domainname.com/http://domainname.com/javascripts/codex/MANIFEST.js跑不安全內容。

如果有一些像window.onerror這樣的事件,但是對於警告,那將會很棒。有什麼想法嗎?

+0

我想知道同樣的事情。記錄負面的資源請求結果也會很好。 :) – SimplGy

回答

12

你可以自己包裝console方法。例如,爲了記錄陣列中的每個呼叫:

var logOfConsole = []; 

var _log = console.log, 
    _warn = console.warn, 
    _error = console.error; 

console.log = function() { 
    logOfConsole.push({method: 'log', arguments: arguments}); 
    return _log.apply(console, arguments); 
}; 

console.warn = function() { 
    logOfConsole.push({method: 'warn', arguments: arguments}); 
    return _warn.apply(console, arguments); 
}; 

console.error = function() { 
    logOfConsole.push({method: 'error', arguments: arguments}); 
    return _error.apply(console, arguments); 
}; 
+2

我在想這個,但它不適用於我的一些期望,例如,當一切都加載到安全頁面時,當一些不安全的內容被加載時,我會得到很多警告,這來自瀏覽器,而不是JavaScript代碼。另外我想覆蓋愚蠢的IE瀏覽器(這就是爲什麼這到我腦海)和控制檯是不明確的那裏。無論如何,你從我的投票:) –

+0

對於IE使用'var message = Array。prototype.slice.apply(arguments).join('');返回_error(消息);'等 –

0

在您使用做的console.log()相同的功能,簡單地張貼同樣的消息到您在記錄日誌的網絡服務。

+0

不是選項,它是昂貴的,如果頁面有100個錯誤和警告,我應該爲每個Ajax請求,我不這麼認爲 –

+0

@MilanJaric,你的反對使得不感。如果您捕獲控制檯輸出,您仍然可以進行100次AJAX調用。 –

+0

不,我將它保存在一個變量(對象)中,當用戶即將離開頁面時,它會將數據發佈到後端。 –

0

你正在倒退。相反,攔截記錄錯誤時,觸發事件爲錯誤處理機制的一部分,並將其記錄作爲一個事件偵聽器:

try 
{ 
    //might throw an exception 
    foo(); 
} 
catch (e) 
{ 
    $(document).trigger('customerror', e); 
} 

function customErrorHandler(event, ex) 
{ 
    console.error(ex) 
} 
function customErrorHandler2(event, ex) 
{ 
    $.post(url, ex); 
} 

這個代碼使用jQuery和嚴格過於簡單用作例子。

+0

jQuery不是選項,如果它無法加載:) –

+0

@MilanJaric,那麼如果你的錯誤處理代碼無法加載呢?如果您的AJAX日誌數據庫調用失敗會怎麼樣? –

+0

它不會,如果它在頁面裏'' –

2

更多Succint方式:

// this method will proxy your custom method with the original one 
 
function proxy(context, method, message) { 
 
    return function() { 
 
    method.apply(context, [message].concat(Array.prototype.slice.apply(arguments))) 
 
    } 
 
} 
 

 
// let's do the actual proxying over originals 
 
console.log = proxy(console, console.log, 'Log:') 
 
console.error = proxy(console, console.error, 'Error:') 
 
console.warn = proxy(console, console.warn, 'Warning:') 
 

 
// let's test 
 
console.log('im from console.log', 1, 2, 3); 
 
console.error('im from console.error', 1, 2, 3); 
 
console.warn('im from console.warn', 1, 2, 3);

0

我知道這是一個老的文章,但它可能是有用的反正作爲其他的解決方案是不支持舊版本的瀏覽器兼容。

你可以重新定義的每個功能控制檯(和所有瀏覽器)這樣的行爲:

// define a new console 
var console = (function(oldCons){ 
    return { 
     log: function(text){ 
      oldCons.log(text); 
      // Your code 
     }, 
     info: function (text) { 
      oldCons.info(text); 
      // Your code 
     }, 
     warn: function (text) { 
      oldCons.warn(text); 
      // Your code 
     }, 
     error: function (text) { 
      oldCons.error(text); 
      // Your code 
     } 
    }; 
}(window.console)); 

//Then redefine the old console 
window.console = console; 
相關問題