如何使用Sentry报告console.error?

时间:2018-05-31 22:18:56

标签: javascript error-handling sentry

我有应用程序,其中一些关键问题报告<ul class="sub-menu"> <li><a>something</a></li> <li><a>something</a></li> <li><a>something</a></li> <li><a>something</a></li> <li><a>something</a></li> <li><a>something</a></li> <li class="somestuff">some markup</li> </ul>但不是console.error因此应用程序可能会继续运行 - 可能处于残缺状态。

还需要报告thrown个问题,但Sentry(Raven)库只向服务器发送抛出的异常。

有人知道如何妥善解决这个问题吗?

(理想情况下无需重写所有console.error次调用,因为某些供应商库可能仍会将输出写入控制台)

5 个答案:

答案 0 :(得分:3)

找到了一个小小的解决方案:

const consoleError = console.error;
console.error = function(firstParam) {
   const response = consoleError.apply(console, arguments);
   Raven.captureException(firstParam, { level: 'error' });
 }
 return response;
};

它只包装console.log并将控制台中的每个错误日志报告给Raven(Sentry)。

如果有人有更好的方法(可能是Sentry的一些隐藏功能),请随时分享!

答案 1 :(得分:2)

基于@Marc Schmid的解决方案,如果您链​​接到Sentry CDN文件,我想出了以下工作示例。

<script src="https://browser.sentry-cdn.com/5.11.1/bundle.min.js" integrity="sha384-r7/ZcDRYpWjCNXLUKk3iuyyyEcDJ+o+3M5CqXP5GUGODYbolXewNHAZLYSJ3ZHcV" crossorigin="anonymous"></script>
<!-- https://github.com/getsentry/sentry-javascript/issues/1976#issuecomment-492260648 -->
<script src="https://browser.sentry-cdn.com/5.11.1/captureconsole.min.js"></script>
<script>
    Sentry.init({
        dsn: 'https://abcdef1234567890@sentry.io/012345',
        debug: false,
        integrations: [
            new Sentry.Integrations.CaptureConsole({
                levels: ['error']
            })
        ],
    });
</script>

答案 2 :(得分:1)

这是一个更强大的覆盖解决方案

// creating function declarations for better stacktraces (otherwise they'd be anonymous function expressions)
var oldConsoleError = console.error;
console.error = reportingConsoleError; // defined via function hoisting
function reportingConsoleError() {
  var args = Array.prototype.slice.call(arguments);
  Sentry.captureException(reduceConsoleArgs(args), { level: 'error' });
  return oldConsoleError.apply(console, args);
};

var oldConsoleWarn = console.warn;
console.warn = reportingConsoleWarn; // defined via function hoisting
function reportingConsoleWarn() {
  var args = Array.prototype.slice.call(arguments);
  Sentry.captureMessage(reduceConsoleArgs(args), { level: 'warning' });
  return oldConsoleWarn.apply(console, args);
}

function reduceConsoleArgs(argsArray) {
  let errorMsg = args[0];
  // Make sure errorMsg is either an error or string.
  // It's therefore best to pass in new Error('msg') instead of just 'msg' since
  // that'll give you a stack trace leading up to the creation of that new Error
  // whereas if you just pass in a plain string 'msg', the stack trace will include
  // reportingConsoleError and reportingConsoleCall
  if (!(errorMsg instanceof Error)) {
    // stringify all args as a new Error (which creates a stack trace)
    errorMsg = new Error(
      args.reduce(function(accumulator, currentValue) {
        return accumulator.toString() + ' ' + currentValue.toString();
      }, '')
    );
  }
  return errorMsg;
}

答案 3 :(得分:1)

我编写了一个使用您的Sentry实例进行操作的库。 https://github.com/aneldev/dyna-sentry

答案 4 :(得分:0)

@ kumar303用户在对问题的评论中提到...您可以使用JS控制台集成Sentry.Integrations.CaptureConsole

有关文档,请参见https://docs.sentry.io/platforms/javascript/?platform=browsernpm#captureconsole

最后,用于设置Sentry的JS代码如下:

Sentry.init({
  dsn: 'https://your-sentry-server-dsn',
  integrations: [
    new Integrations.CaptureConsole({
      levels: ['error']
    })
  ],
  release: '1.0.0',
  environment: 'prod',
  maxBreadcrumbs: 50
})

如果有人打电话给console.error,则新事件将发送到哨兵。