2012-07-09 32 views
57

thể trùng lặp:
Intercept calls to console.log in Chrome
Can I extend the console object (for rerouting the logging) in javascript?Chụp javascript console.log?

Khi ứng dụng JS của tôi viết cho tín hữu console.log, tôi muốn chụp rằng thông điệp đăng nhập để tôi có thể AJAX mà đăng nhập đầu ra máy chủ. Làm thế nào để làm điều đó?

Mã viết cho nhật ký là từ các dịch vụ bên ngoài, đó là lý do tại sao tôi không thể chỉ trực tiếp ajax nó.

Trả lời

113

Bạn có thể chiếm quyền điều khiển các chức năng JavaScript theo cách sau đây:

(function(){ 
    var oldLog = console.log; 
    console.log = function (message) { 
     // DO MESSAGE HERE. 
     oldLog.apply(console, arguments); 
    }; 
})(); 
  1. Dòng 1 kết thúc tốt chức năng của bạn khi đóng nên không có chức năng nào khác có quyền truy cập trực tiếp vào oldLog (vì lý do bảo trì).
  2. Dòng 2 chụp phương thức gốc.
  3. Dòng 3 tạo chức năng mới.
  4. Dòng 4 là nơi bạn gửi message tới máy chủ của mình.
  5. Dòng 5 gọi phương thức ban đầu vì nó đã được xử lý ban đầu.

apply được sử dụng vì vậy chúng tôi có thể gọi nó trênconsole sử dụng những lập luận ban đầu. Chỉ cần gọi oldLog(message) sẽ không thành công vì log phụ thuộc vào sự liên kết của nó với console.


Cập nhật mỗi zzzzBov của bình luận dưới đây, trong IE9 console.log không phải là thực sự là một chức năng rất oldLog.apply sẽ thất bại. Xem console.log.apply not working in IE9 để biết thêm chi tiết.

+1

[Mã của bạn sẽ gặp sự cố trong IE vì 'console.log' không thực sự là một cá thể' Hàm' trong IE] (http://stackoverflow.com/questions/5538972/console-log-apply-not-working- in-ie9). – zzzzBov

+0

@zzzzBov Thú vị. Tôi giả định gán 'console._oldLog = console.log; console._oldLog (message); 'sẽ hoạt động, nhưng nếu' console' chính nó là một đối tượng được lưu trữ, không có thay đổi nào được đảm bảo. Thật không may, tôi không có IE để kiểm tra điều này nữa. –

+0

yea, bạn vẫn có thể gọi '_oldLog' như thế. 'oldLog = Function.prototype.bind.call (console.log, console)' hoạt động cho IE9 +, nhưng sau đó cần một polyfill cho 'Function.prototype.bind' cho IE8 và dưới đây. – zzzzBov

16

đơn giản:

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

window.console.log = yourCustomLog; 

Bạn có thể muốn ghi đè lên toàn bộ đối tượng console để nắm bắt console.info, console.warn và như vậy:

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

Bạn không thể sử dụng window.console = {...} vì window.console là thuộc tính chỉ đọc! – Luillyfe

Các vấn đề liên quan