Flutter远程日志记录插件flutter_feature_remote_logging的使用

Flutter远程日志记录插件flutter_feature_remote_logging的使用

Description

flutter_feature_remote_logging 是一个用于从远程记录设备日志的库。

日志记录平台

Google Cloud Logging

使用 Google Cloud Logging 平台进行远程日志记录。

构造函数
参数 类型 描述
serviceAccount Map<String, dynamic> 从 Google Cloud 获取的 Secret Key。
env String 用于分类日志的环境标识。
初始化方法

调用此函数在创建构造函数后初始化远程日志服务。

远程日志写入

将日志写入到指定的远程日志平台。

参数 类型 描述
level Level 用于标识日志的级别。
message String 日志消息。
labels Map<String, String> 日志的嵌套值。
添加默认标签

为日志添加默认标签值。

参数 类型 描述
labels Map<String, String> 想要设置为日志默认值的嵌套值。
移除默认标签

从默认标签中移除标签。

参数 类型 描述
labels List 想要从默认标签中移除的标签键列表。
Betterstack

使用 Betterstack 平台进行远程日志记录。

构造函数
参数 类型 描述
sourceToken String 通过 API 发送日志的访问令牌。
初始化方法

调用此函数在创建构造函数后初始化远程日志服务。

远程日志写入

将日志写入到指定的远程日志平台。

参数 类型 描述
level Level 用于标识日志的级别。
message String 日志消息。
labels Map<String, String> 日志的嵌套值。
添加默认标签

为日志添加默认标签值。

参数 类型 描述
labels Map<String, String> 想要设置为日志默认值的嵌套值。
移除默认标签

从默认标签中移除标签。

参数 类型 描述
labels List 想要从默认标签中移除的标签键列表。

示例代码

以下是一个完整的示例代码,展示如何使用 flutter_feature_remote_logging 插件。

import 'dart:convert';
import 'dart:developer';
import 'dart:io';

import 'package:example/data/dto/model/feature_model.dart';
import 'package:example/presentation/widget/feature_widget.dart';
import 'package:flutter/material.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';
import 'package:flutter_feature_remote_logging/flutter_feature_remote_logging.dart';
import 'package:logger/logger.dart';

late GoogleCloudLoggingServiceImpl googleServiceImpl;
late FeatureBetterStackRemoteLoggingServiceImpl betterstackServiceImpl;

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

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  [@override](/user/override)
  void initState() {
    super.initState();
    WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
      // 初始化 Google Cloud Logging
      try {
        DefaultAssetBundle.of(context).loadString('assets/example-learn-purpose-4dd93f634791.json').then((value) {
          final serviceAccount = json.decode(value) as Map<String, dynamic>;
          log("service-account: $serviceAccount");
          googleServiceImpl = GoogleCloudLoggingServiceImpl(
            serviceAccount: serviceAccount,
            env: "dev",
          );
          googleServiceImpl.init();
        });
      } catch (e) {
        log("failed init google service: $e");
      }

      // 初始化 Betterstack
      try {
        dotenv.load(fileName: '.env').then((value) {
          final sourceToken = dotenv.env['BETTERSTACK_SOURCE_TOKEN'];
          if (sourceToken == null) throw Exception('source token missing');
          betterstackServiceImpl = FeatureBetterStackRemoteLoggingServiceImpl(sourceToken: sourceToken);
          betterstackServiceImpl.init();
        });
      } catch (e) {
        log("failed init betterstack: $e");
      }

      Future.delayed(const Duration(seconds: 3), () {
        FeatureRemoteLogger.addLogListener((event) {
          googleServiceImpl.writeLog(level: event.level, message: event.message, labels: event.labels);
          betterstackServiceImpl.writeLog(level: event.level, message: event.message, labels: event.labels);
        });
      });
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Remote Logging',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(title: 'Flutter Remote Logging Example'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  List<FeatureModel> features = [
    FeatureModel(
      title: 'Log something',
      desc: 'Log something',
      key: 'LOG_SOMETHING',
    ),
    FeatureModel(
      title: 'Google Cloud Add Default Label',
      desc: 'Google Cloud Add Default Label',
      key: 'GOOGLE_CLOUD_ADD_DEFAULT_LABEL',
    ),
    FeatureModel(
      title: 'Betterstack Add Default Label',
      desc: 'Betterstack Add Default Label',
      key: 'BETTERSTACK_ADD_DEFAULT_LABEL',
    ),
  ];

  [@override](/user/override)
  void initState() {
    super.initState();
    WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
      Future.delayed(Duration(seconds: 5), () {
        FeatureRemoteLogger().log(Level.info, "start app");
      });
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Remote Logger')),
      body: ListView.builder(
        padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 10),
        itemCount: features.length,
        itemBuilder: (_, index) {
          final feature = features[index];
          return GestureDetector(
            onTap: () async {
              switch (feature.key) {
                case "LOG_SOMETHING":
                  FeatureRemoteLogger().log(
                    Level.info,
                    "fadlurahmanfdev log something",
                  );
                  break;
                case "GOOGLE_CLOUD_ADD_DEFAULT_LABEL":
                  googleServiceImpl.addLabels(labels: {
                    'platform': Platform.operatingSystem,
                  });
                  break;
                case "BETTERSTACK_ADD_DEFAULT_LABEL":
                  betterstackServiceImpl.addLabels(labels: {
                    'platform': Platform.operatingSystem,
                  });
                  break;
              }
            },
            child: ItemFeatureWidget(feature: feature),
          );
        },
      ),
    );
  }
}

更多关于Flutter远程日志记录插件flutter_feature_remote_logging的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter远程日志记录插件flutter_feature_remote_logging的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


flutter_feature_remote_logging 是一个用于在 Flutter 应用中实现远程日志记录的插件。它允许开发者将应用的日志信息发送到远程服务器,以便在需要时进行调试和分析。以下是如何使用 flutter_feature_remote_logging 插件的基本步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  flutter_feature_remote_logging: ^1.0.0  # 请使用最新版本

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

2. 初始化插件

在你的 Flutter 应用中初始化 flutter_feature_remote_logging 插件。通常,你可以在 main.dart 文件中进行初始化:

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // 初始化远程日志记录插件
  await FlutterFeatureRemoteLogging.initialize(
    apiUrl: 'https://your-remote-logging-server.com/api/logs', // 远程日志服务器的URL
    appId: 'your-app-id', // 应用的唯一标识符
    appVersion: '1.0.0', // 应用的版本号
    enableDebugLogs: true, // 是否启用调试日志
  );

  runApp(MyApp());
}

3. 记录日志

在你的应用代码中,你可以使用 FlutterFeatureRemoteLogging 来记录日志。例如:

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Remote Logging Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () {
              // 记录一条日志
              FlutterFeatureRemoteLogging.log(
                level: LogLevel.INFO,
                message: 'Button pressed',
                timestamp: DateTime.now(),
                additionalData: {'button': 'ElevatedButton'},
              );
            },
            child: Text('Log Event'),
          ),
        ),
      ),
    );
  }
}

4. 配置远程服务器

你需要确保你的远程服务器能够接收和处理日志数据。通常,服务器需要提供一个 API 端点来接收日志数据,并将其存储或处理。

5. 处理日志级别

flutter_feature_remote_logging 支持不同的日志级别,如 DEBUGINFOWARNINGERROR 等。你可以根据需要记录不同级别的日志:

FlutterFeatureRemoteLogging.log(
  level: LogLevel.ERROR,
  message: 'An error occurred',
  timestamp: DateTime.now(),
  additionalData: {'errorCode': '404'},
);

6. 自定义日志数据

你可以通过 additionalData 参数传递自定义的日志数据,以便在远程服务器上进行更详细的分析:

FlutterFeatureRemoteLogging.log(
  level: LogLevel.INFO,
  message: 'User logged in',
  timestamp: DateTime.now(),
  additionalData: {'userId': '12345', 'username': 'john_doe'},
);

7. 调试模式

在调试模式下,你可以启用 enableDebugLogs 参数来在控制台中打印日志信息,以便在开发过程中进行调试。

8. 处理网络错误

在实际应用中,网络连接可能会不稳定。你可以通过捕获异常来处理网络错误,并决定是否重试或记录本地日志。

try {
  await FlutterFeatureRemoteLogging.log(
    level: LogLevel.INFO,
    message: 'Network request successful',
    timestamp: DateTime.now(),
  );
} catch (e) {
  print('Failed to send log: $e');
  // 处理错误,例如记录到本地存储
}

9. 清理和关闭

在应用关闭时,你可以选择清理或关闭日志记录器,以确保所有日志都被发送到远程服务器。

[@override](/user/override)
void dispose() {
  FlutterFeatureRemoteLogging.dispose();
  super.dispose();
}
回到顶部