Flutter错误追踪与日志管理插件drift_sentry的使用

Flutter错误追踪与日志管理插件drift_sentry的使用

Drift Sentry

注意

官方插件 sentry_drift 已经发布。请在新项目中使用该插件。

[CI]: https://github.com/utisam/drift_sentry/actions/workflows/ci.yml/badge.svg
[pub package]: https://img.shields.io/pub/v/drift_sentry.svg

Sentry 集成到 drift 包中。

使用方法

LazyDatabase _openConnection() {
  return LazyDatabase(() async {
    final dbFolder = await getApplicationDocumentsDirectory();
    final file = File(p.join(dbFolder.path, 'db.sqlite'));
    // 使用 .addSentry() 包装 QueryExecutor
    return NativeDatabase.createInBackground(file).addSentry();
  });
}

完整示例代码

// 忽略对print的避免使用警告
import 'dart:async';
import 'dart:io';

import 'package:drift/native.dart';
import 'package:drift_sentry/drift_sentry.dart';
import 'package:sentry/sentry.dart';

import 'database.dart';

const dsn = String.fromEnvironment('dsn');

void main() async {
  await runZonedGuarded(() async {
    await Sentry.init(
      (options) => options
        ..dsn = dsn
        ..tracesSampleRate = 1.0
        ..debug = true,
    );
    await _run();
    exit(0);
  }, (exception, stackTrace) async {
    await Sentry.close();
    stderr.writeln(exception.toString());
    exit(-1);
  });
}

Future<void> _run() async {
  final database = ExampleDatabase(
    NativeDatabase.memory().addSentry(),
  );

  final transaction = Sentry.startTransaction(
    'example-transaction',
    'db',
    bindToScope: true,
  );
  try {
    await database
        .into(database.products)
        .insert(ProductsCompanion.insert(title: 'My product'));

    final allProducts = await database.select(database.products).get();
    print('Products in database: $allProducts');

    transaction.status = const SpanStatus.ok();
  } catch (exception) {
    transaction.throwable = exception;
    transaction.status = const SpanStatus.internalError();
    rethrow;
  } finally {
    await transaction.finish();
  }
}

更多关于Flutter错误追踪与日志管理插件drift_sentry的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter错误追踪与日志管理插件drift_sentry的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


drift_sentry 是一个用于 Flutter 应用的插件,它结合了 drift(一个 Flutter 的数据库库)和 sentry(一个错误追踪和日志管理工具)。通过使用 drift_sentry,你可以将数据库操作中的错误和日志信息发送到 Sentry,从而更好地监控和调试你的应用。

安装 drift_sentry

首先,你需要在 pubspec.yaml 文件中添加 drift_sentry 依赖:

dependencies:
  drift_sentry: ^latest_version

然后运行 flutter pub get 来安装依赖。

配置 Sentry

在使用 drift_sentry 之前,你需要配置 Sentry。你可以在 main.dart 文件中初始化 Sentry:

import 'package:sentry_flutter/sentry_flutter.dart';

void main() async {
  await SentryFlutter.init(
    (options) {
      options.dsn = 'YOUR_SENTRY_DSN';
      // 其他 Sentry 配置
    },
    appRunner: () => runApp(MyApp()),
  );
}

使用 drift_sentry

接下来,你可以在你的 drift 数据库中使用 drift_sentry 来捕获和发送错误日志。

首先,创建一个 DriftSentry 实例并将其与你的数据库连接:

import 'package:drift/drift.dart';
import 'package:drift_sentry/drift_sentry.dart';
import 'package:sentry/sentry.dart';

class MyDatabase extends _$MyDatabase {
  MyDatabase._internal(QueryExecutor executor) : super(executor);

  factory MyDatabase() {
    final sentry = DriftSentry(SentryClient());
    return MyDatabase._internal(sentry.wrapExecutor(LazyDatabase(() async {
      return NativeDatabase.memory();
    })));
  }
}

在上面的代码中,我们创建了一个 DriftSentry 实例,并将其包装在 LazyDatabase 上。这样,所有的数据库操作都会通过 DriftSentry 进行监控,任何错误都会被捕获并发送到 Sentry。

捕获自定义错误

你也可以手动捕获自定义错误并将其发送到 Sentry:

import 'package:drift/drift.dart';
import 'package:drift_sentry/drift_sentry.dart';
import 'package:sentry/sentry.dart';

class MyDatabase extends _$MyDatabase {
  MyDatabase._internal(QueryExecutor executor) : super(executor);

  factory MyDatabase() {
    final sentry = DriftSentry(SentryClient());
    return MyDatabase._internal(sentry.wrapExecutor(LazyDatabase(() async {
      return NativeDatabase.memory();
    })));
  }

  Future<void> insertData(MyData data) async {
    try {
      await into(myTable).insert(data);
    } catch (e, stackTrace) {
      await sentry.captureException(e, stackTrace: stackTrace);
      rethrow;
    }
  }
}
回到顶部