# 错误日志收集

# 集成sentry日志收集

注册sentry,官方地址:https://sentry.io/ (opens new window),注册完成之后,就可以创建Flutter的项目了:

image-20220129152708976

# 安装依赖

dependencies:
  sentry_flutter: ^6.2.2

使用flutter pub get安装依赖。

# 配置sentry

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

Future<void> main() async {
  await SentryFlutter.init(
    (options) {
      options.dsn = 'https://f8ec7ac644ac4d749ee18ac058bed41b@o1050376.ingest.sentry.io/6173778';
      // Set tracesSampleRate to 1.0 to capture 100% of transactions for performance monitoring.
      // We recommend adjusting this value in production.
      options.tracesSampleRate = 1.0;
    },
    // 可以修改这个函数,加入初始化应用,比如getIt
    appRunner: () => runApp(MyApp()),
  );

  // or define SENTRY_DSN via Dart environment variable (--dart-define)
}  

收集错误:

import 'package:sentry/sentry.dart';

try {
  aMethodThatMightFail();
} catch (exception, stackTrace) {
  await Sentry.captureException(
    exception,
    stackTrace: stackTrace,
  );
}

// 这个可以放到dio_error_interceptor中

# 集成Bugly日志收集

在Bugly官方https://bugly.qq.com/v2/ (opens new window)注册账号。

新增产品(iOS与Android):

image-20220129155002896

选择平台与分类,创建完成。

点选产品,选择设置:

image-20220129155149555

# 安装依赖

dependencies:
  flutter_bugly: ^0.4.3

使用flutter pub get安装依赖。

# 配置Bugly

调整main.dart文件

void main() async {
  // Bugly
  FlutterBugly.postCatchedException(
    () async {
      await GetStorage.init();
      setupGetIt();
      // ..
      NotificationsUtils notificationsUtils = getIt<NotificationsUtils>();
      // 请求消息权限
      Timer(Duration(seconds: 0), () async {
        await notificationsUtils.requestIOSPermissions();
        await notificationsUtils.initNotifications();
      });

      runApp(MyApp());
    },
    // 这里特别说明一下,如果开发模式没有收到错误日志,是因为没有设置debugUpload
    // debugUpload: true,
  );
}

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  
  void initState() {
    super.initState();
    // 在这里初始化
    FlutterBugly.init(androidAppId: "b3ca88f6d5", iOSAppId: "7b10e672ce");
  }
// ...

调整dio的error拦截器:

class ErrorInterceptor extends Interceptor {
  ErrorInterceptor();

  
  void onError(DioError err, ErrorInterceptorHandler handler) {
    // print('onError: $err');
    // 401 -> refreshToken
    HttpException httpException = parseException(err);
    // 4xx 5xx -> parseException -> 日志 -> 本地数据库&缓存
    // 发送错误日志的请求
    FlutterBugly.uploadException(
        message: err.message, detail: err.stackTrace.toString());
    handler.resolve(Response(
        requestOptions: err.requestOptions,
        statusCode: httpException.code,
        data: {
          'code': httpException.code,
          'message': httpException.message,
        }));
    // super.onError(err, handler);
  }
}

bugly错误:

image-20220129160143003