返回

错误的简易前端监控实现

前端

简化问题

错误监控一直以来都是后端开发人员的噩梦,不断有人为新的日志库和不同的工具编写代码,希望能够追踪错误来源,但现在前端代码越来越重,错误监控也变得更加复杂,也是时候将前端错误监控提上日程了。

问题1:简化日志收集

首先尝试解决一个问题,如何收集我们的 JavaScript 错误呢?我们可以把 console.error() 重写一下,它会记录下所有出错的信息。

const log = console.log;
console.log = function () {
  log.apply(console, arguments);
  window.storeError(arguments);
}

通过重写 console.log 方法,我们实现了将所有错误信息转发到一个 storeError 函数,并且把 storeError 挂载到 window 上,以便在我们的 HTML 中调用。然后在 HTML 中引入代码。

<script>
  window.addEventListener('error', (event) => {
    storeError({
      errorMessage: event.error.message,
      errorUrl: event.error.filename,
      errorLine: event.error.lineno,
      errorColumn: event.error.colno,
      errorStack: event.error.stack,
    });
  });
</script>

注意: 这里我们只收集基本的信息,因为复杂的信息不容易传输。

问题2:简化发送

我们已经有了错误信息,但是现在怎么把它们发送到一个服务器上呢?我们使用 fetch() 方法发送一个 POST 请求。

<script>
  const storeError = (errorInfo) => {
    fetch('/api/error', {
      method: 'POST',
      body: JSON.stringify(errorInfo),
      headers: {
        'Content-Type': 'application/json',
      },
    }).then((res) => {
      if (res.ok) {
        console.log('Error sent successfully!');
      } else {
        console.error('Error sending error!');
      }
    }).catch((err) => {
      console.error('Error sending error!', err);
    });
  };
</script>

问题3:简化存储

现在我们在服务器上有了所有的错误信息,我们需要存储它们以便查看。我们创建一个 MongoDB 数据库,并使用 Mongoose 来定义我们的错误模型。

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const errorSchema = new Schema({
  errorMessage: String,
  errorUrl: String,
  errorLine: Number,
  errorColumn: Number,
  errorStack: String,
  timestamp: {
    type: Date,
    default: Date.now(),
  },
});

const Error = mongoose.model('Error', errorSchema);

然后我们可以通过 POST 请求将错误信息存储到数据库中。

app.post('/api/error', async (req, res) => {
  const error = new Error(req.body);
  await error.save();
  res.sendStatus(200);
});

问题4:简化界面

我们已经有了错误信息,并且存储在了数据库中,现在我们需要一个界面来查看它们。我们可以创建一个简单的 Node.js 服务器,它会读取数据库中的错误信息,并将其显示在一个 HTML 页面上。

<!DOCTYPE html>
<html>
  <head>
    
  </head>
  <body>
    <h1>Errors</h1>
    <ul>
      <% errors.forEach((error) => { %>
        <li>
          <%= error.errorMessage %>
          <br>
          <%= error.errorUrl %>
          <br>
          <%= error.errorLine %>
          <br>
          <%= error.errorColumn %>
          <br>
          <%= error.errorStack %>
        </li>
      <% }); %>
    </ul>
  </body>
</html>

我们可以使用 Express.js 来创建一个简单的 Node.js 服务器。

const express = require('express');
const app = express();

// Get all errors
app.get('/errors', async (req, res) => {
  const errors = await Error.find();
  res.json(errors);
});

// Start the server
app.listen(3000);

这样就完成了一个简单的错误监控程序,它可以收集、存储和显示 JavaScript 错误。当然,这是一个非常简单的例子,在实际生产环境中,您可能需要考虑更多的功能,例如错误分组、错误过滤、错误告警等。

集成第三方错误追踪服务

如果您不想自己编写错误监控程序,也可以集成一个第三方错误追踪服务,例如 Sentry、Bugsnag 或 Rollbar。这些服务可以开箱即用,并且提供丰富的功能,例如错误分组、错误过滤、错误告警等。

1. Sentry

Sentry 是一个流行的错误追踪服务,它提供了一个 JavaScript SDK,可以轻松集成到您的前端应用程序中。

import * as Sentry from '@sentry/browser';

Sentry.init({
  dsn: 'YOUR_DSN',
});

2. Bugsnag

Bugsnag 是另一个流行的错误追踪服务,它也提供了一个 JavaScript SDK,可以轻松集成到您的前端应用程序中。

import Bugsnag from '@bugsnag/js';

Bugsnag.start({
  apiKey: 'YOUR_API_KEY',
});

3. Rollbar

Rollbar 是一个流行的错误追踪服务,它也提供了一个 JavaScript SDK,可以轻松集成到您的前端应用程序中。

import Rollbar from '@rollbar/rollbar';

Rollbar.init({
  accessToken: 'YOUR_ACCESS_TOKEN',
});

集成第三方错误追踪服务后,您就可以使用这些服务提供的功能来跟踪和报告 JavaScript 错误。