Flutter日志记录插件fiona_logger的使用

Flutter日志记录插件fiona_logger的使用

本包可以帮助您记录应用程序的消息。

功能

使用FionaLogger可以将您的应用程序消息记录到不同的存储库中。存储库可以是系统控制台、文件、数据库表等,您可以定义任何想要作为存储库的东西。

入门

该包实现了一个简单的存储库,用于将消息写入系统控制台,但之后您可以定义自己的自定义存储库。

要了解该想法和结构,您可以阅读这篇文章: https://medium.com/nerd-for-tech/logger-for-flutter-how-to-log-your-messages-in-flutter-944df9be487c

使用方法

您可以在example目录下找到一个完整的示例。

您必须使用GetIt包来注册日志及其存储库。该包包含使用系统控制台(LogInConsole)的存储库。

GetIt.instance.registerFactory<LogDataRepository>(() => LogInConsole());
GetIt.instance.registerFactory<FionaLogger>(() => FionaLogger(level: Level.verbose));

然后您就可以使用它:

FionaLogger logger = GetIt.instance<FionaLogger>();

logger.d("一条调试信息");
logger.i("一条信息");
logger.e("一条错误信息");

您还可以定义自己的存储库。例如,在我的项目中,我使用了这个包,并创建了一个LogDataRepository来使用SQLite:

class LogDataSQLite implements LogDataRepository {

  SQLiteDatabase _sqlite = DependencyManager().get<SQLiteDatabase>();

  [@override](/user/override)
  Future<void> clear() async {
    final Database db = await _sqlite.initializeDB();
    try {
      await db.delete(SQLiteScheme.logData_tableName);
    } catch (err) {
      // 错误处理
    }
  }

  [@override](/user/override)
  Future<void> add(LogData logData) async {
    final Database db = await _sqlite.initializeDB();
    await db.insert(
        SQLiteScheme.logData_tableName, logData.toMap(),
        conflictAlgorithm: ConflictAlgorithm.replace);
  }

  [@override](/user/override)
  Future<List<LogData>> getAll() async {
    final Database db = await _sqlite.initializeDB();
    final List<Map<String, Object?>> queryResult =
    await db.query(SQLiteScheme.logData_tableName, orderBy: 'datetime DESC');
    return queryResult.map((e) => LogData.fromMap(e)).toList();
  }
}

然后在项目的启动设置中,注入该数据存储库的依赖项:

GetIt.instance.registerLazySingleton<LogDataRepository>(() => LogDataSQLite());

示例代码

以下是一个完整的示例代码,展示了如何使用fiona_logger插件进行日志记录。

import 'package:fiona_logger/fiona_logger.dart';
import 'package:flutter/material.dart';
import 'package:get_it/get_it.dart';

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

  // 注册日志存储库和FionaLogger
  GetIt.instance.registerFactory<LogDataRepository>(() => LogInConsole());
  GetIt.instance
      .registerFactory<FionaLogger>(() => FionaLogger(level: Level.verbose));

  runApp(const MyApp());
}

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

  // 应用程序根组件
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'i18n Example',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: MyHomePage(title: 'i18n Example Page'),
    );
  }
}

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

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

class _MyHomePageState extends State<MyHomePage> {
  FionaLogger logger = GetIt.instance<FionaLogger>();

  [@override](/user/override)
  Widget build(BuildContext context) {
    List<Widget> children = List.empty(growable: true);

    String message = "Example message to log";

    children.add(Center(
        child: Text(
      "FionaLogger示例",
      style: const TextStyle(fontSize: 20),
    )));

    children.add(Row(
      crossAxisAlignment: CrossAxisAlignment.center,
      children: [
        Expanded(
            flex: 5,
            child: ElevatedButton(
              onPressed: () async {
                logger.d(message); // 记录调试信息
                setState(() {});
              },
              child: const Text("调试日志"),
            )),
        Expanded(
            flex: 5,
            child: ElevatedButton(
              onPressed: () async {
                logger.i(message); // 记录信息日志
                setState(() {});
              },
              child: const Text("信息日志"),
            ))
      ],
    ));

    children.add(Row(
      crossAxisAlignment: CrossAxisAlignment.center,
      children: [
        Expanded(
            flex: 5,
            child: ElevatedButton(
              onPressed: () async {
                logger.e(message); // 记录错误日志
                setState(() {});
              },
              child: const Text("错误日志"),
            )),
        Expanded(
            flex: 5,
            child: ElevatedButton(
              onPressed: () async {
                logger.w(message); // 记录警告日志
                setState(() {});
              },
              child: const Text("警告日志"),
            )),
      ],
    ));
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(widget.title),
      ),
      body: ListView(
        children: [
          Padding(
            padding: const EdgeInsets.all(10),
            child: Column(
              children: children,
            ),
          )
        ],
      ),
    );
  }
}

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

1 回复

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


fiona_logger 是一个用于 Flutter 应用的日志记录插件,它可以帮助开发者更方便地记录和管理应用中的日志信息。以下是如何使用 fiona_logger 的基本步骤:

1. 添加依赖

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

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

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

2. 初始化 Logger

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

import 'package:fiona_logger/fiona_logger.dart';

void main() {
  // 初始化 Logger
  FionaLogger.init(
    level: Level.ALL,  // 设置日志级别
    isShowTime: true,  // 是否显示时间
    isShowLevel: true, // 是否显示日志级别
  );

  runApp(MyApp());
}

3. 记录日志

在应用的任何地方,你都可以使用 FionaLogger 来记录日志。fiona_logger 提供了不同级别的日志记录方法:

import 'package:fiona_logger/fiona_logger.dart';

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // 记录不同级别的日志
    FionaLogger.v("Verbose log");  // 详细日志
    FionaLogger.d("Debug log");    // 调试日志
    FionaLogger.i("Info log");     // 信息日志
    FionaLogger.w("Warning log");  // 警告日志
    FionaLogger.e("Error log");    // 错误日志
    FionaLogger.wtf("WTF log");    // 严重错误日志

    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

4. 日志级别

fiona_logger 支持以下日志级别:

  • Level.ALL: 记录所有日志。
  • Level.VERBOSE: 记录详细日志。
  • Level.DEBUG: 记录调试日志。
  • Level.INFO: 记录信息日志。
  • Level.WARNING: 记录警告日志。
  • Level.ERROR: 记录错误日志。
  • Level.WTF: 记录严重错误日志。
  • Level.OFF: 关闭所有日志记录。

你可以在初始化时设置日志级别,以控制哪些级别的日志会被记录。

5. 自定义日志输出

fiona_logger 允许你自定义日志的输出格式。你可以通过 FionaLogger.init 方法中的 formatter 参数来自定义日志格式:

FionaLogger.init(
  level: Level.ALL,
  isShowTime: true,
  isShowLevel: true,
  formatter: (level, message, time) {
    return "[${time.toIso8601String()}] [$level] $message";
  },
);

6. 日志文件输出

fiona_logger 还支持将日志输出到文件中。你可以通过 FionaLogger.init 方法中的 filePath 参数来指定日志文件的路径:

FionaLogger.init(
  level: Level.ALL,
  isShowTime: true,
  isShowLevel: true,
  filePath: "/path/to/log/file.log",
);

7. 日志过滤

你可以通过 FionaLogger.init 方法中的 filter 参数来过滤日志。filter 是一个函数,它接收日志级别和消息,并返回一个布尔值,表示是否记录该日志:

FionaLogger.init(
  level: Level.ALL,
  isShowTime: true,
  isShowLevel: true,
  filter: (level, message) {
    return level != Level.VERBOSE;  // 不记录详细日志
  },
);

8. 日志清理

fiona_logger 还提供了日志清理功能,你可以通过 FionaLogger.clearLogs 方法来清理日志文件:

FionaLogger.clearLogs();

9. 日志查看

你可以通过 FionaLogger.getLogs 方法来获取日志内容:

String logs = FionaLogger.getLogs();
print(logs);

10. 日志上传

fiona_logger 还支持将日志上传到服务器。你可以通过 FionaLogger.uploadLogs 方法来上传日志:

FionaLogger.uploadLogs(url: "https://example.com/upload-logs");
回到顶部