Flutter日志分析与监控插件loglytics的使用

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

Flutter日志分析与监控插件loglytics的使用

📊 Loglytics

Loglytics 提供了一个完整的解决方案,用于简单但强大的日志记录,并同时(但可选地)发送应用内部的分析和崩溃报告。最初,这个包是为了集成到 firebase_analyticsfirebase_crashlytics 中创建的,但通过一个可爱的界面,现在也可以实现其他分析或崩溃报告解决方案。

除了简化日志记录和发送分析外,Loglytics 还旨在改善您的整体分析方法。所有在 Loglytics 内部的分析都基于主题和参数。每个分析都将根据功能(或其他项目部分,您认为合适)进行封装,并为它们定义主题列表(例如 'login_button') 和可能的参数(例如 'time_on_page')。一般来说,主题可以有一个事件关联到它们,而参数则是额外详细信息。因为我们为每个功能(或其他项目部分)指定并存储了我们的分析,在一个中央位置,我们避免了错误,并在项目中创造了某种秩序、清晰和结构,这通常是当分析从各个地方发送时经常被忽视的。

🔎 如何开始?

首先,我们需要确定是否要在项目中实现自定义分析和/或崩溃报告。如果不需要,我们仍然可以使用 Loglytics 来记录和发送基本分析,而无需进行任何配置。如果我们确实想使用其中一个或两者,我们必须实现 AnalyticsInterfaceCrashReportsInterface,以便将它们传递给 Loglytics.setUp() 方法。在调用 Loglytics.setUp() 方法之前,我们需要发送任何分析或崩溃报告。下面是一个使用 Firebase Analytics 和 Firebase Crashlytics 的实现示例。请注意,analytics 参数中的回调是必要的,以方便访问我们实现的 Analytics 对象。更多关于 Analytics 对象的信息稍后会提到。

import 'package:firebase_analytics/firebase_analytics.dart';
import 'package:loglytics/analytics/analytics_interface.dart';

class AnalyticsImplementation implements AnalyticsInterface {
  AnalyticsImplementation(this._firebaseAnalytics);
  final FirebaseAnalytics _firebaseAnalytics;

  @override
  Future<void> logEvent({required String name, Map<String, Object?>? parameters}) async {
    await _firebaseAnalytics.logEvent(name: name, parameters: parameters);
  }

  @override
  Future<void> resetAnalyticsData() async {
    await _firebaseAnalytics.resetAnalyticsData();
  }

  @override
  Future<void> setCurrentScreen({required String name, String? screenClassOverride}) {
    if (screenClassOverride != null) {
      return _firebaseAnalytics.setCurrentScreen(screenName: name, screenClassOverride: screenClassOverride);
    } else {
      return _firebaseAnalytics.setCurrentScreen(screenName: name);
    }
  }

  @override
  Future<void> setUserId(String? id) async {
    await _firebaseAnalytics.setUserId(id);
  }

  @override
  Future<void> setUserProperty({required String name, required String? value}) async {
    await _firebaseAnalytics.setUserProperty(name: name, value: value);
  }
}
import 'package:firebase_crashlytics/firebase_crashlytics.dart';
import 'package:flutter/foundation.dart';
import 'package:loglytics/crashlytics/crashlytics_interface.dart';

class CrashReportsImplementation implements CrashReportsInterface {
  CrashReportsImplementation(this._firebaseCrashlytics);
  final FirebaseCrashlytics _firebaseCrashlytics;

  @override
  Future<void> log(String message) async {
    await _firebaseCrashlytics.log(message);
  }

  @override
  Future<void> recordError(
    exception,
    StackTrace? stack, {
    reason,
    Iterable<DiagnosticsNode> information = const [],
    bool? printDetails,
    bool fatal = false,
  }) async {
    await _firebaseCrashlytics.recordError(
      exception,
      stack,
      reason: reason,
      information: information,
      printDetails: printDetails,
      fatal: fatal,
    );
  }

  @override
  Future<void> setCustomKey(String key, Object value) async {
    await _firebaseCrashlytics.setCustomKey(key, value);
  }

  @override
  Future<void> setUserIdentifier(String identifier) async {
    await _firebaseCrashlytics.setUserIdentifier(identifier);
  }
}
Loglytics.setUp(
  analyticsInterface: AnalyticsImplementation(Object()),
  crashReportsInterface: CrashReportsImplementation(Object()),
);

📈 如何发送分析(和崩溃报告)?

接下来,我们需要确定如何实现特征样式的分析实施方式。无论如何,重要的是我们可以定义项目的某些部分(如一个功能),并将其链接到特定部分的主题和参数(或功能)。一旦我们明确了这一点,我们就可以设置第一个 Analytics 实现的实例。下面是一个登录功能示例,其中包含一个主题和一个参数的实现。

import 'package:loglytics/loglytics.dart';

class LoginAnalytics extends Analytics {
  final String loginButton = 'login_button';
  final String timeOnPage = 'time_on_page';

  final String _loginView = 'login_view';

  void viewPage() {
    service.viewed(subject: _loginView);
  }
}

在指定主题和参数之后,我们现在需要将 LoginAnalytics 对象添加到我们早些时候提到的 Loglytics.setUp 调用中。我们通过在 AnalyticsFactory 中注册对象来实现这一点。此方法接受一个回调,该回调用于通过依赖注入和 get_it 包提供 Analytics 对象。一起看起来应该像这样:

Loglytics.setUp(
  analyticsImplementation: AnalyticsImplementation(Object()),
  crashReportsImplementation: CrashReportsImplementation(Object()),
  shouldLogAnalytics: true,
  analytics: (analyticsFactory) {
    analyticsFactory.registerAnalytic(() =&gt; LoginAnalytics());
  },
);

请注意,我们使用单独的 GetIt 实例来维护这些回调。如果你的应用程序使用 GetIt 并且你时不时重置它,请不要忘记重置这些(或者选择不这样做,你的选择)。

现在我们可以移动到我们的第一个 Loglytics 混入类的使用。我们将刚刚制作的登录 Analytics 实现的名字作为通用参数传递给 Loglytics 混入类。这看起来如下:

class LoginClass with Loglytics&lt;LoginAnalytics&gt; {}

💡 提示:评论你的 Analytics 实现,并为分析师创建 Dart 文档,这样他们就能了解应用程序内正在发送的所有分析!

这就是全部内容,现在我们有了所有工具来为应用程序的这一特性/项目部分的日志记录和发送分析。现在当我们输入 analytics 然后选择一个动作时,我们会拥有所有定义的主题和参数(对于这一特性/项目部分)的回调(✨)。使用它可以看起来像这样:

class LoginClass with Loglytics&lt;LoginAnalytics&gt; {
  
  void initialise() {
    // 其他代码在这里
    analytics.viewPage();
  }

  void login() {
    // 让我们在按钮点击时进行日志记录。
    analytics.service.tapped(subject: analytics.loginButton);
    // 假设登录成功。
    analytics.service.succeeded(
      subject: analytics.login,
      parameters: {
        // 那花了点时间
        analytics.timeOnPage: 123,
      },
    );
  }
}

🔧 自定义分析

如果我们要在 Analytics 实现中使用自己的方法(而不是主题字符串),则可以使用 CustomAnalytic 对象。这是一个简单的包装器,接受事件名称和可选参数。为了发送它,必须调用事件方法。这个方法的行为与其他方法相似,只是只有一个回调,并且它期望一个 CustomAnalytic 对象作为返回值(你可以通过特定的方法从你的 Analytics 实现传递下来)。实现它可以看起来像这样:

class ExampleAnalytics extends Analytics {
  // 事件名称
  final buttonViewedWithSomeMagic = 'button_viewed_with_some_magic';
  // 参数
  final name = 'name';

  CustomAnalytic buttonViewedWithSomeMagic(String buttonName) {
    return CustomAnalytic(
      name: buttonViewedWithSomeMagic,
      parameters: {
        name: buttonName,
      },
    );
  }
}

使用它可以看起来像这样:

void _doSomething() {
  analytics.service.custom(analytic: analytics.buttonViewedWithSomeMagic('magic_button'));
}

☝️ 使用类独立地

从版本 0.10.0 开始,也有可能创建 Log, LoglyticsAnalyticsService 对象。如果你在 Loglytics.setUp 方法中定义了 CrashlyticsInterfaceAnalyticsInterface,这些也将向其相应的实现发送事件。定义三个类可能会看起来有点像这样:

class IndividualUsage {
  late final Loglytics loglytics = Loglytics.create(location: runtimeType.toString());
  late final Log log = Log(location: runtimeType.toString());
  late final AnalyticsService analyticsService = AnalyticsService();
}

更多关于Flutter日志分析与监控插件loglytics的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter日志分析与监控插件loglytics的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中使用loglytics插件进行日志分析与监控的代码示例。请注意,loglytics是一个假设的插件名称,实际中你可能需要使用一个具体的、真实存在的Flutter日志监控插件,如sentry_flutterfirebase_crashlytics。不过,为了符合你的要求,我将以loglytics作为示例名称进行说明。

1. 添加依赖

首先,你需要在pubspec.yaml文件中添加loglytics插件的依赖。由于这是一个假设的插件,实际的依赖名称和版本号可能会有所不同。

dependencies:
  flutter:
    sdk: flutter
  loglytics: ^1.0.0  # 假设的版本号

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

2. 初始化插件

在你的Flutter应用的入口文件(通常是main.dart)中,初始化loglytics插件。这通常涉及到设置一些配置参数,如API密钥、日志级别等。

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

void main() {
  // 初始化loglytics插件
  Loglytics.initialize(
    apiKey: 'YOUR_API_KEY',  // 替换为你的API密钥
    logLevel: LogLevel.debug, // 设置日志级别
  );

  runApp(MyApp());
}

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

3. 使用插件记录日志

在你的应用中,你可以使用loglytics插件来记录不同级别的日志。

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

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Loglytics Demo'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            // 记录一条debug级别的日志
            Loglytics.log(message: 'This is a debug log', level: LogLevel.debug);

            // 记录一条info级别的日志
            Loglytics.log(message: 'This is an info log', level: LogLevel.info);

            // 记录一条warning级别的日志
            Loglytics.log(message: 'This is a warning log', level: LogLevel.warning);

            // 记录一条error级别的日志
            Loglytics.log(message: 'This is an error log', level: LogLevel.error);
          },
          child: Text('Log Messages'),
        ),
      ),
    );
  }
}

4. 捕获异常和错误

为了更全面地监控你的应用,你还可以使用loglytics插件来捕获未处理的异常和错误。

import 'package:flutter/material.dart';
import 'package:loglytics/loglytics.dart';
import 'dart:async';

void main() {
  Loglytics.initialize(
    apiKey: 'YOUR_API_KEY',
    logLevel: LogLevel.debug,
  );

  // 捕获未处理的异常
  FlutterError.onError = (FlutterErrorDetails details) {
    Loglytics.logError(details: details);
  };

  // 捕获Zone中的未捕获异常
  runZonedGuarded<Future<void>>(() async {
    runApp(MyApp());
  }, (Object error, StackTrace stackTrace) {
    Loglytics.logError(error: error, stackTrace: stackTrace);
  });
}

注意

  • 上述代码示例是基于一个假设的loglytics插件。在实际使用中,你需要根据所选插件的文档进行相应的调整。
  • 确保你已经在loglytics服务中创建了项目并获取了API密钥。
  • 根据你的需求调整日志级别和日志内容。

希望这个示例能帮助你在Flutter项目中集成日志分析与监控插件。如果你使用的是具体的插件(如sentry_flutterfirebase_crashlytics),请参考相应插件的官方文档进行集成。

回到顶部