Flutter错误追踪插件sentry_logging的使用

发布于 1周前 作者 htzhanglong 来自 Flutter

Flutter错误追踪插件sentry_logging的使用


Sentry与logging包的集成

package build pub likes popularity pub points
sentry_logging build pub package likes popularity pub points

此包是为[logging](https://pub.dev/packages/logging)包提供的Sentry集成。

使用方法

  1. 注册一个Sentry.io账户,并在Sentry.io获取DSN。
  2. 根据pub.dev上的说明安装sentry_logging包。
  3. 使用从Sentry.io获得的DSN初始化Sentry SDK,并添加LoggingIntegration
import 'package:sentry/sentry.dart';
import 'package:sentry_logging/sentry_logging.dart';

Future<void> main() async {
  await Sentry.init(
    (options) {
      options.dsn = 'https://example@sentry.io/example'; // 替换为你的DSN
      options.addIntegration(LoggingIntegration());
    },
    appRunner: initApp, // 初始化你的应用程序。
  );
}

void initApp() {
  // 应用程序代码
}

示例代码

以下是一个完整的示例,展示了如何在Flutter应用中使用sentry_logging来记录日志和捕获异常:

import 'package:sentry_logging/sentry_logging.dart';
import 'dart:async';
import 'package:sentry/sentry.dart';
import 'package:logging/logging.dart';

Future<void> main() async {
  // 注意:请替换下面的DSN为你自己的DSN,在Sentry.io上获取。 
  const dsn =
      'https://e85b375ffb9f43cf8bdf9787768149e0@o447951.ingest.sentry.io/5428562';

  await Sentry.init(
    (options) {
      options.dsn = dsn;
      options.addIntegration(LoggingIntegration());
    },
    appRunner: runApp,
  );
}

Future<void> runApp() async {
  final log = Logger('MyAwesomeLogger');

  log.warning('这是一条警告!');

  try {
    throw Exception();
  } catch (error, stackTrace) {
    // 上面的日志将包含在这个崩溃报告中。
    await Sentry.captureException(
      error,
      stackTrace: stackTrace,
    );
  }
}

资源

希望以上信息可以帮助您更好地理解和使用sentry_logging插件。如果您有任何问题或需要进一步的帮助,请随时提问!


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

1 回复

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


在Flutter项目中,使用sentry_logging(现在更常用的是sentry-flutter)插件可以有效地进行错误追踪和日志记录。以下是一个详细的代码示例,展示如何在Flutter项目中集成和使用sentry-flutter插件。

1. 添加依赖

首先,在你的pubspec.yaml文件中添加sentry-flutter依赖:

dependencies:
  flutter:
    sdk: flutter
  sentry_flutter: ^6.0.0  # 请确保使用最新版本,版本号可能有所不同

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

2. 初始化Sentry

在你的main.dart文件或者一个合适的初始化位置,配置并初始化Sentry:

import 'package:flutter/material.dart';
import 'package:sentry_flutter/sentry_flutter.dart';

void main() {
  // 配置Sentry
  Sentry.init({
    "dsn": "https://<your-sentry-dsn>@o<your-sentry-org>.ingest.sentry.io/<your-sentry-project-id>",
    "release": "1.0.0",  // 应用的版本号
    "environment": "production",  // 环境,例如production, staging, development
    "debug": true,  // 是否开启调试模式
    "enableAutoSessionTracking": true,  // 是否自动跟踪会话
    "tracesSampleRate": 1.0,  // 性能监控采样率,1.0表示100%采样
  });

  // 检查Sentry是否成功初始化
  Sentry.captureEvent(
    SentryEvent(
      message: "Sentry initialized",
      level: SentryLevel.info,
    ),
  );

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Sentry Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Sentry Example'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            // 模拟一个错误
            throw UnhandledException("This is a test exception");
          },
          child: Text('Throw Exception'),
        ),
      ),
    );
  }
}

// 捕获全局异常
Future<void> myErrorHandler(FlutterEngine flutterEngine, FlutterError errorDetails) async {
  // 捕获并记录Flutter框架错误
  Sentry.captureException(errorDetails.exception, stackTrace: errorDetails.stack);
  // 可以选择性地重新抛出异常
  Zone.current.handleUncaughtError(errorDetails.exception!, errorDetails.stack!);
}

void setupUnhandledExceptionHandlers() {
  // 捕获未处理的Dart异常
  FlutterError.onError = myErrorHandler;

  // 捕获未捕获的异常
  Isolate.current!.unhandledExceptions = (List<dynamic> exceptionDetails) async {
    try {
      final Throwable exception = exceptionDetails.first as Throwable;
      Sentry.captureException(exception);
    } catch (captureError, captureStackTrace) {
      // 捕获Sentry记录异常时发生的错误
      print("Failed to capture exception: $captureError");
      captureStackTrace?.printStackTrace();
    } finally {
      // 调用默认的未捕获异常处理函数
      rethrow;
    }
  };
}

void _initSentryAndHandlers() {
  // 初始化Sentry
  Sentry.init({
    "dsn": "https://<your-sentry-dsn>@o<your-sentry-org>.ingest.sentry.io/<your-sentry-project-id>",
    // 其他配置...
  });

  // 设置全局异常处理器
  setupUnhandledExceptionHandlers();
}

void main() {
  _initSentryAndHandlers();
  runApp(MyApp());
}

3. 捕获自定义事件和日志

你可以在任何需要的地方捕获自定义事件和日志:

void logCustomEvent() {
  Sentry.captureEvent(
    SentryEvent(
      message: "Custom Event",
      level: SentryLevel.info,
      extra: {
        "custom_key": "custom_value",
      },
    ),
  );
}

void logCustomError() {
  Sentry.captureException(Exception("This is a custom error"));
}

4. 发送面包屑(Breadcrumbs)

面包屑可以帮助你了解在错误发生之前的事件序列:

void logBreadcrumb() {
  Sentry.addBreadcrumb(
    Breadcrumb(
      message: "User navigated to settings",
      category: "navigation",
      level: SentryLevel.info,
      data: {
        "screen_name": "SettingsScreen",
      },
    ),
  );
}

5. 清理和关闭Sentry

在应用关闭时,可以清理Sentry资源:

void cleanupSentry() {
  Sentry.close();
}

确保在适当的时机(如应用生命周期的onTerminate回调中)调用cleanupSentry函数。

通过上述步骤,你就可以在Flutter项目中成功集成并使用sentry-flutter插件进行错误追踪和日志记录了。

回到顶部