Flutter日志管理插件harmony_log的使用

Flutter日志管理插件harmony_log的使用

Harmony Logging Mechanism

安装

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

dependencies:
  harmony_log: ^latest.version

然后导入 harmony_log 库:

import 'package:harmony_log/harmony_log.dart';

使用

日志系统包含两个主要部分:一个表示为 Log 类的日志记录器,以及一个表示为 LogOutput 类的输出。每个 Log 类的请求都会被转换为 LogEvent 并添加标识符和时间信息,然后重定向到指定的 LogOutput。

LogEvent 包含 message、error、stackTrace 和 level(由 LogLevel 枚举表示)以及其他一些信息,如 id(由给定的 LogId 生成)、time 和 extra。extra 是一个通用字段,类型为 Object,用于在日志事件中添加额外信息。

LogId 用于 Log 类生成每个日志事件的 ID。您可以使用 LogId 工厂,如 counter(从起始值开始计数)、constant(始终生成相同的给定 ID)和 custom(自定义逻辑生成 ID)。这些工厂可以在 Dart 文档中查看。

除了 Log 类上的通用 log 方法外,您还可以访问帮助方法 v、d、i、w、e 和 wtf,这些方法根据它们的首字母缩写添加 level。您还可以访问 Log 类上的 write 方法,这是一个低级方法,可以直接指定日志事件。LogLevel 枚举有 6 种不同的日志级别,例如 LogLevel.verbose 的重要性为 0,LogLevel.wtf 的重要性为 5。LogLevel 可以通过 compareTo 方法或比较运算符(如 >=)进行比较。

Log 类应使用 init 初始化,并使用 close 关闭。调用 init 后应立即使用。但在调用 close 后的行为是不确定的,即关闭后继续使用日志可能会实际记录事件,但不会抛出错误。关闭操作可能是异步完成的。必须在调用 init 后且在调用 close 前调用日志方法。init 和 close 命令会被重定向到 LogOutput。

Log 类通过提供 LogOutput、LogId 和 tag 来创建。tag 默认为 null。建议您为应用程序日志创建一个带有 null tag 的 Log 类,然后从您的日志记录器创建带标记的日志记录器。这样做可以使用相同的输出和 ID 生成系统,因此只需初始化一个即可,所有日志记录器都已初始化,并且对于关闭也是一样。

LogOutput 通过其工厂创建。有些输出负责将事件重定向到其他输出,如 filtered 用于过滤事件并重定向到其他输出,multi 用于输出到多个其他输出,redirect 用于根据条件将输出重定向到其他输出,redirectOnDebug 仅在调试时将输出重定向到其他输出。还有一些终端输出,如 noop 不执行任何操作。还有一个特殊的 custom 输出,可以通过提供 init、write 和 close 操作的函数来创建自定义输出。还有一个特殊的 plain 工厂,用于输出纯文本数据。还有一个 developerLog 日志输出,可以将日志输出到 dart:developer。

过滤事件是通过使用特殊的 filtered LogOutput 工厂来实现的。您应该提供一个过滤事件的目标输出和一个 LogFilter 来过滤事件。LogFilter 可以通过其工厂创建,例如 level 将允许等于或大于指定级别的事件,all 将允许所有事件,none 将不允许任何事件,debug 将仅允许调试时的事件,以及其他一些工厂可以在 Dart 文档中查看。还有一个 custom 工厂用于创建自定义过滤逻辑。所有 LogFilter 都支持标准的集合操作,如 |、&、- 和 !。

纯文本输出是您将日志输出到控制台和文件的地方。输出纯文本数据是通过使用特殊的 plain LogOutput 工厂来实现的。您应该提供一个 LogPlainFilter 和一个 LogPlainOutput。

LogPlainFilter 负责将日志事件转换为字符串行列表。它可以通过其工厂创建,如 simple 将格式化简单的单行输出,pretty 将格式化事件为类似框视图的格式,json 将格式化事件为 JSON。json 格式特别适用于输出到文件。LogPlainFilter 还会在日志输出的开头和结尾添加序列,例如在 JSON 中,我们需要 [ 和 ] 在文件的开头和结尾使其有意义。还有一个 custom 工厂可以用来实现自定义的格式化机制。

LogPlainOutput 负责输出字符串行列表。一些纯文本输出负责将事件重定向到其他纯文本输出,如 multi 用于输出到多个其他输出,redirect 用于根据条件将输出重定向到其他输出。还有一些终端输出,如 noop 不执行任何操作,console 用于使用 print 语句输出数据,file 用于将数据输出到文件中的给定目录路径。文件名基于创建时间,并带有前缀、后缀和扩展名,可以根据需要更改。文件输出不能在 Flutter Web 上使用。

注意,过滤总是会通过 init 和 close 操作。最好使用 redirect 及其方言在不同情况下完全启用/禁用日志记录。

基本示例

该示例仅在调试时记录,并使用简单格式输出到控制台:

import 'package:harmony_log/harmony_log.dart';

void main() {
  final log = Log(
    id: LogId.counter(),
    child: LogOutput.redirectOnDebug(
      child: LogOutput.plain(
        format: LogPlainFormat.simple(),
        child: LogPlainOutput.console(),
      ),
    ),
  );
  log.init();
  log.i('hello, there!');
  log.e('bad code!', error: AssertionError());
  log.close();
}

带有漂亮格式的复杂示例

该示例仅在调试时记录,并使用漂亮格式输出到控制台,同时过滤至少为 info 级别的日志,并使用计数器 ID 生成:

final log = Log(
  id: LogId.counter(),
  child: LogOutput.redirectOnDebug(
    child: LogOutput.filtered(
      filter: LogFilter.level(LogLevel.info),
      child: LogOutput.plain(
        format: LogPlainFormat.pretty(),
        child: LogPlainOutput.console(),
      ),
    ),
  ),
);

综合示例

该示例展示了在调试时仅在控制台上以漂亮格式显示至少为 debug 级别的日志,在发布时将至少为 error 级别的日志发送到服务器,并将所有日志保存到文件中:

final log = Log(
  id: LogId.counter(),
  child: LogOutput.multi(
    children: [
      LogOutput.redirectOnDebug(
        child: LogOutput.filtered(
          filter: LogFilter.level(LogLevel.debug),
          child: LogOutput.plain(
            format: LogPlainFormat.simple(),
            child: LogPlainOutput.console(),
          ),
        ),
      ),
      LogOutput.plain(
        format: LogPlainFormat.json(),
        child: LogPlainOutput.file(
          path: 'path/to/directory',
        ),
      ),
      LogOutput.redirectOnRelease(
        child: LogOutput.filtered(
          filter: LogFilter.level(LogLevel.error),
          child: LogOutput.custom(
            write: (e) {
              // 发送事件到服务器
            },
          ),
        ),
      ),
    ],
  ),
);

创建带标签的日志记录器

final log = Log(/* ... */);

final otherLog = log.tagged('OTHER');

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

1 回复

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


当然,以下是如何在Flutter项目中使用harmony_log插件进行日志管理的示例代码。harmony_log插件可以帮助你更有效地管理和输出日志信息,这对于调试和监控应用非常有用。

1. 添加依赖

首先,在你的pubspec.yaml文件中添加harmony_log的依赖:

dependencies:
  flutter:
    sdk: flutter
  harmony_log: ^最新版本号  # 请替换为最新的版本号

然后运行flutter pub get来获取依赖。

2. 初始化HarmonyLog

在你的应用入口文件(通常是main.dart)中初始化HarmonyLog。你可以配置日志级别、输出格式等。

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

void main() {
  // 初始化HarmonyLog
  HarmonyLog.instance
    ..init(
      level: LogLevel.debug, // 设置日志级别
      printToConsole: true,  // 是否输出到控制台
      logFilePath: '/sdcard/flutter_logs/', // 日志文件存储路径(注意路径权限)
      logFileName: 'app_log.txt', // 日志文件名
      outputFormat: '【${dateTime}】【${level}】【${tag}】${message}\n', // 日志输出格式
    )
    ..info('应用启动', tag: 'Main');

  runApp(MyApp());
}

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

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  void initState() {
    super.initState();
    // 示例日志输出
    HarmonyLog.instance.debug('这是调试信息', tag: 'HomePage');
    HarmonyLog.instance.info('这是信息日志', tag: 'HomePage');
    HarmonyLog.instance.warn('这是警告日志', tag: 'HomePage');
    HarmonyLog.instance.error('这是错误日志', tag: 'HomePage', error: Exception('示例异常'));
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Demo Home Page'),
      ),
      body: Center(
        child: Text('查看日志输出'),
      ),
    );
  }
}

3. 日志级别

harmony_log支持多种日志级别,包括:

  • LogLevel.verbose
  • LogLevel.debug
  • LogLevel.info
  • LogLevel.warn
  • LogLevel.error

你可以根据需求设置日志级别,低于该级别的日志将不会被输出。

4. 自定义日志格式

在初始化HarmonyLog时,你可以通过outputFormat参数自定义日志输出格式。dateTime、level、tag和message是预定义的占位符,分别代表日志时间、日志级别、日志标签和日志消息。

5. 日志文件存储

日志文件将存储在指定的路径下,你可以通过logFilePath和logFileName参数来配置。请确保应用有权限写入该路径。

注意事项

  • 在Android设备上,你可能需要在AndroidManifest.xml中添加存储权限。
  • 确保日志路径对应用是可写的,尤其是在iOS设备上,你可能需要将日志文件存储在应用的沙盒目录中。

通过以上步骤,你就可以在Flutter项目中使用harmony_log插件来管理日志了。希望这些代码示例对你有所帮助!

回到顶部