Flutter日志管理插件smart_logs的使用

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

Flutter日志管理插件smart_logs的使用

概述

Smart Log 是一个为 Flutter 应用设计的简洁包,旨在简化用户事件记录和异常报告。通过此包,用户可以通过友好的对话框轻松向开发者提交错误报告。开发者可以指定他们的电子邮件地址,从而简化接收重要错误报告的过程。

目录

安装

1. 添加依赖

在你的项目 pubspec.yaml 文件中添加以下依赖:

dependencies:
  smart_logs: ^1.0.6

2. 获取依赖

你可以从命令行安装包:

使用 pub:

$ pub get

使用 flutter:

$ flutter pub get

3. 导入包

在你的 Dart 代码中导入 Smart Log 包:

import 'package:smart_logs/smart_logs.dart';

Android 配置

在 Android 11 及更高版本中,引入了软件包可见性,这改变了应用在用户设备上查询已安装应用程序和包的能力。为了使您的应用能够获取到这些包的可见性,你需要在 AndroidManifest.xml 中添加查询列表。

注意: 要在 Android 上使用默认报告按钮设置的报告对话框,您需要执行一些配置步骤。以下是必要的说明:

<manifest package="com.mycompany.myapp">
  <queries>
    <intent>
      <action android:name="android.intent.action.SENDTO" />
      <data android:scheme="mailto" />
    </intent>
  </queries>
</manifest>

使用

Smart Log 这个包提供了多种方法来实现不同的功能。但是,为了确保其正常运行,首先需要初始化它。建议在 main 函数中调用初始化方法以获得最佳性能,例如:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Slog.initializeSLog();
  runApp(const MyApp());
}

它有许多可选配置属性,包括:

  • forceFullyDelete – 删除与日志相关的所有内容(如 zip, json 和 .log 文件)。
  • daysToDeleteLog – 删除创建于指定日期之前的所有日志,默认删除 7 天前的日志。
  • logFolderName – 指定日志文件夹或目录的名称。
  • logZipFileName – 指定日志 zip 文件的名称。
  • jsonFileName – 指定 json 文件的名称。

此外,还有一些自定义设置器、获取器和回调:

  • setForceFullyDelete(bool value) – 设置为 true 时,将强制删除所有与日志相关的数据。
  • setZipPassword(String value) – 此设置方法允许你为创建的 zip 文件添加密码。
  • getLogFileAsText – 返回当前日志文件内容作为字符串。
  • summaryLog({ String tag = "Message", required String text, bool shouldSave = true, dynamic exception,dynamic stackTrace }) – 此方法将日志消息添加到日志文件。exception 参数是可选的,可用于在日志消息中包含异常。
  • getLogAsZip() - 创建日志文件的 zip 文件并返回 zip 文件的路径。

注意: 如果你直接调用 Slog 的实例,可能会遇到 NotInitializationException。当调用初始化方法时,初始化需要一些时间。建议等待初始化方法完成后再使用 Slog 实例。

// 添加日志
Slog.instance.summaryLog(text: 'your message');
// 带有异常的日志
Slog.instance.summaryLog(text: 'your message', exception: YourException());
// 获取文件内容作为字符串
Slog.instance.getLogFileAsText;
// 带有异常的日志
Slog.instance.summaryLog(text: 'your message', exception: YourException(), stackTrace: StackTrace());

智能日志报告对话框

智能报告对话框是 Smart Log Flutter 包的一部分,用于简化收集用户错误报告的过程。用户可以输入他们的错误报告消息,当他们点击发送按钮时,会被重定向到他们的电子邮件应用程序,并带有预配置的电子邮件。邮件中包含两个默认附件:一个压缩的日志文件和一个包含设备信息的 deviceinfo.json 文件。该对话框高度可定制,允许你修改标题、提示文本、按钮标题、按钮样式和对话框背景。你还可以自定义发送按钮回调以提供自己的功能。此包简化了错误报告过程,增强了用户体验。

对话框

SLDialog.SL_DIALOG(
  context,
  sendToEmail: 'example@gmail.com',
  emailsubject: 'Example Bug by user',
);

注意: 这三个参数是必需的。其中一个是位置参数,另外两个是命名参数。

智能日志报告对话框所有参数

SL_DIALOG(
  BuildContext context, {
  required String emailsubject,
  required String sendToEmail,
  bool dialogBarrierDismissible = false,
  ButtonStyle? reportButtonStyle,
  BoxDecoration? topContainerDecoration,
  Color? dialogBackgroundColor,
  Color? emailBodyTextFieldBackgrounColor,
  Color dialogBarrierColor = Colors.black38,
  Color? lineColor,
  Color? cursorColor,
  Color toastBackGround = Colors.black,
  Color toastTextColor = Colors.white,
  double dialogElevation = 0,
  double dialogWithOpacity = .5,
  double toastFontSize = 15,
  EdgeInsetsGeometry? dialogWidgetsPadding,
  Function()? reportButtonPress,
  Widget? reportButtonIcon,
  int maxEmailBodyTextFieldLines = 10,
  int maxEmailBodyCharacterLength = 4000,
  int minimumEmailBodyLength = 10,
  String hintText = 'Write here about your bug detail',
  String? minmumToastText,
  
  ToastGravity toastGravity = ToastGravity.BOTTOM,
  List<String>? sendToEmails,
  List<String>? cc,
  List<String>? bcc,
  List<String>? attachmentsPaths,
  TextStyle? emailBodyTextStyle,
  TextStyle? hintTextStyle,
  Widget? reportButtonTitle,
  Widget? divider,
  Widget? reportTitle,
  TextStyle? textFieldTextStyle,
})

问题或需求

如果您遇到任何问题,请随时打开 问题。如果您觉得库缺少某个功能,请在 GitHub 上提出 需求,我会进行评估。也欢迎提交 Pull Request。


示例代码

import 'package:smart_logs/smart_logs.dart';

import 'package:flutter/material.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Slog.initializeSLog();
  runApp(const MyApp());
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return const MaterialApp(
      title: 'Smart log Demo',
      // theme: ThemeData(useMaterial3: true),
      debugShowCheckedModeBanner: false,
      home: SendBugReport(),
    );
  }
}

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

  [@override](/user/override)
  State<SendBugReport> createState() => _SendBugReportState();
}

class _SendBugReportState extends State<SendBugReport> {
  [@override](/user/override)
  void initState() {
    super.initState();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        elevation: 0,
        title: const Text("Smart Log"),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          crossAxisAlignment: CrossAxisAlignment.stretch,
          children: [
            Padding(
              padding: const EdgeInsets.all(8.0),
              child: ElevatedButton(
                onPressed: () async {
                  Slog.instance.summaryLog(
                    text: 'User Press add log button',
                    // shouldSave: false,
                  );
                },
                child: const Text(
                  "Add Log",
                ),
              ),
            ),
            Padding(
              padding: const EdgeInsets.all(8.0),
              child: ElevatedButton(
                onPressed: () async {
                  try {
                    throw const FormatException();
                  } on FormatException catch (e, stackTrace) {
                    Slog.instance.summaryLog(
                      text: 'User Press add log button',
                      exception: e,
                      stackTrace: stackTrace,
                      // shouldSave: false,
                    );
                  }
                },
                child: const Text(
                  "Add Log with exception",
                ),
              ),
            ),
            Padding(
              padding: const EdgeInsets.all(8.0),
              child: ElevatedButton(
                onPressed: () async {
                  Slog.instance.summaryLog(
                    text: 'User Press Report button',
                    shouldSave: false,
                  );

                  SLDialog.SL_DIALOG(
                    context,
                    sendToEmail: 'example@gmail.com',
                    emailsubject: 'Example Bug by user',
                    topHandlerColor: Colors.black.withOpacity(.7),
                    attachmentsPaths: [],
                  );
                },
                child: const Text(
                  "Report a bug",
                ),
              ),
            ),
            Padding(
              padding: const EdgeInsets.all(8.0),
              child: ElevatedButton(
                onPressed: () async {
                  Slog.instance.setForceFullyDelete = true;
                },
                child: const Text(
                  "Remove Logs",
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

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

1 回复

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


当然,以下是一个关于如何使用Flutter日志管理插件smart_logs的代码案例。这个插件可以帮助你更方便地管理和输出日志信息。

首先,确保你的Flutter项目已经创建,并在pubspec.yaml文件中添加smart_logs依赖:

dependencies:
  flutter:
    sdk: flutter
  smart_logs: ^最新版本号  # 请替换为当前最新版本号

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

接下来,在你的Flutter项目中配置和使用smart_logs。以下是一个简单的示例:

1. 初始化SmartLogs

在你的主文件(通常是main.dart)中初始化SmartLogs

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

void main() {
  // 初始化SmartLogs,设置日志级别和输出格式
  SmartLogs.init(
    level: LogLevel.verbose, // 可以设置为 debug, info, warn, error, verbose
    outputFormat: '【{level}】{message} - {time}\n',
  );

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomePage(),
    );
  }
}

2. 使用SmartLogs输出日志

在你的应用逻辑中使用SmartLogs来输出不同级别的日志:

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

class HomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Smart Logs Demo'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            // 输出不同级别的日志
            SmartLogs.v('这是一个verbose级别的日志');
            SmartLogs.d('这是一个debug级别的日志');
            SmartLogs.i('这是一个info级别的日志');
            SmartLogs.w('这是一个warn级别的日志');
            SmartLogs.e('这是一个error级别的日志');
          },
          child: Text('输出日志'),
        ),
      ),
    );
  }
}

3. 自定义日志输出(可选)

如果你希望将日志输出到文件或其他地方,你可以通过实现SmartLogHandler来自定义日志输出。例如,将日志输出到文件:

import 'dart:io';
import 'package:smart_logs/smart_logs.dart';

class FileLogHandler implements SmartLogHandler {
  File _logFile;

  FileLogHandler(String logFilePath) {
    _logFile = File(logFilePath);
    // 确保日志文件存在
    _logFile.createSync(recursive: true);
  }

  @override
  void log(SmartLog log) {
    _logFile.writeAsStringSync(
      '${log.outputFormat.replaceAll('{level}', log.level.name)
        .replaceAll('{message}', log.message)
        .replaceAll('{time}', log.time)}\n',
      mode: FileMode.append,
    );
  }
}

void main() {
  // 自定义日志处理器
  SmartLogs.addHandler(FileLogHandler('app_logs.txt'));

  // 初始化SmartLogs(如果需要可以重新设置级别和格式)
  SmartLogs.init(
    level: LogLevel.verbose,
    outputFormat: '【{level}】{message} - {time}\n',
  );

  runApp(MyApp());
}

这样,你的日志信息将会被写入到指定的文件app_logs.txt中。

通过以上步骤,你已经成功地在Flutter项目中集成并使用了smart_logs插件来进行日志管理。这个插件可以帮助你更方便地追踪和调试应用中的问题。

回到顶部