web-dev-qa-db-ja.com

Sentryでconsole.errorを報告する方法は?

いくつかの重大な問題がconsole.errorで報告されているが、thrownではないアプリケーションがあるため、アプリケーションが引き続き実行される可能性があります。

console.errorの問題も報告する必要がありますが、Sentry(Raven)ライブラリがサーバーに送信するのは例外のみです。

誰かがこれをうまく解決する方法を知っていますか?

(理想的には、すべてのconsole.error呼び出しを書き直す必要がないため、一部のベンダーライブラリでもコンソールに出力を書き込む可能性があります)

7
Jurosh

少しハッキーな解決策を見つけました:

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)に報告するだけです。

誰かがより良いアプローチ(おそらくセントリーの隠された機能)を持っているなら、気軽に共有してください!

2
Jurosh

@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://[email protected]/012345',
        debug: false,
        integrations: [
            new Sentry.Integrations.CaptureConsole({
                levels: ['error']
            })
        ],
    });
</script>
0
marcus

これがより堅牢なオーバーライドソリューションです

// 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;
}
0
Devin G Rhode

Sentryインスタンスを使用してこれを実行するライブラリを作成しました。 https://github.com/aneldev/dyna-sentry

0
Dennis T