【问题标题】:Is there a way in JavaScript to listen console events?JavaScript中有没有办法监听控制台事件?
【发布时间】:2011-12-21 10:47:34
【问题描述】:

我正在尝试在 Javascript 中为未捕获的异常和浏览器警告编写处理程序。所有错误和警告都应发送到服务器以供以后查看。

处理的异常可以被捕获并轻松记录

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

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

因此,如果从 javascript 代码中调用它们就没有问题,甚至可以通过这种和平的代码捕获未处理的异常:

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

所以异常被很好地覆盖了,但我一直坚持浏览器发送到控制台的警告。例如安全或 html 验证警告。以下示例取自 Google Chrome 控制台

https://domainname.com/ 的页面运行了来自 http://domainname.com/javascripts/codex/MANIFEST.js.

如果有一些像 window.onerror 这样的事件但会发出警告,那就太好了。有什么想法吗?

【问题讨论】:

  • 我也在想同样的事情。记录负面的资源请求结果也会很棒。 :)

标签: javascript browser cross-browser dom-events


【解决方案1】:

您可以自己包装 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);
};

【讨论】:

  • 我正在考虑这个,但它不会满足我的一些期望,例如,当所有内容加载到安全页面时,当加载一些不安全的内容时,我会收到大量警告,这来自浏览器,而不是javascript代码。我还想介绍愚蠢的 IE(这就是我想到的原因),并且控制台在那里未定义。不管怎样,你得到了我的投票:)
  • 对于 IE 使用 var message = Array.prototype.slice.apply(arguments).join(' '); return _error(message);
  • 最好将旧日志存储在局部变量而不是全局变量上,这个答案表明stackoverflow.com/questions/6455631/listening-console-log
【解决方案2】:

在您用于执行 console.log() 的同一函数中,只需将相同的消息发布到您正在记录日志的 Web 服务。

【讨论】:

  • 不是选项,太贵了,如果页面有 100 个错误和警告怎么办,我应该为每个 ajax 请求做,我不这么认为
  • @MilanJaric,你的反对毫无意义。如果您正在捕获控制台输出,您仍然会进行 100 次 AJAX 调用。
  • 不,我将它保存在一个变量(对象)中,当用户即将离开页面时,它会将数据发布到后端。
  • Milan - 如果您想减少 AJAX 请求的数量,您可以将控制台消息推送到一个数组并发送该数组。但是一般当用户离开页面时,JS函数会停止,所以不会发布数据。
【解决方案3】:

你正在倒退。不要在记录错误时进行拦截,而是作为错误处理机制的一部分触发事件并将其记录为事件侦听器之一:

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,并且被过度简化以用作示例。

【讨论】:

  • jQuery 不是选项,如果加载失败怎么办:)
  • @MilanJaric,那么如果您的错误处理代码无法加载怎么办?如果您的 AJAX-log-to-database 调用失败怎么办?
  • 如果在<script> my handler goes here </script>内的页面中则不会
  • @MilanJaric,您可以在不使用 jQuery 的情况下触发自定义事件。我使用 jQuery 只是因为它是一种显示示例的简单方法。不使用 jQuery 来触发自定义事件的代码要复杂得多,并且比我回答您的问题所花费的时间要长。
  • 但并非所有错误都可以被捕获。 ERR_BLOCKED_BY_CLIENT 就是一个例子。尝试捕获它。
【解决方案4】:

更简洁的方式:

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

【讨论】:

  • @AiShiguang 什么意思?
  • 在记录内容的行尾显示了一个行号。它不能指向调用控制台日志的正确位置
  • 问题是关于监听控制台事件,这是正确的答案。如果您要查找的是行号,请查看:stackoverflow.com/questions/13815640/…
  • 没问题。我没有投反对票,兄弟。至于监听控制台事件,这个方案还是稍微打破了之前的特性
  • 好方法,我使用 ...message 来获取所有的消息项
【解决方案5】:

我知道这是一篇旧帖子,但它仍然很有用,因为其他解决方案与旧浏览器不兼容。

您可以像这样重新定义控制台(以及所有浏览器)的每个功能的行为:

// 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;

【讨论】:

    【解决方案6】:

    我需要在移动设备上调试控制台输出,因此我构建了这个插件库来捕获控制台输出和类别并将其转储到页面。检查源代码,它非常简单。

    https://github.com/samsonradu/Consolify

    【讨论】:

      猜你喜欢
      • 2019-06-12
      • 2016-10-15
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 2011-03-30
      • 2013-05-16
      • 1970-01-01
      相关资源
      最近更新 更多