Flutter日志管理插件harmony_log的使用

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

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 包含 messageerrorstackTracelevel(由 LogLevel 枚举表示)以及其他一些信息,如 id(由给定的 LogId 生成)、timeextraextra 是一个通用字段,类型为 Object,用于在日志事件中添加额外信息。

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

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

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

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

LogOutput 通过其工厂创建。有些输出负责将事件重定向到其他输出,如 filtered 用于过滤事件并重定向到其他输出,multi 用于输出到多个其他输出,redirect 用于根据条件将输出重定向到其他输出,redirectOnDebug 仅在调试时将输出重定向到其他输出。还有一些终端输出,如 noop 不执行任何操作。还有一个特殊的 custom 输出,可以通过提供 initwriteclose 操作的函数来创建自定义输出。还有一个特殊的 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 上使用。

注意,过滤总是会通过 initclose 操作。最好使用 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参数自定义日志输出格式。dateTimeleveltagmessage是预定义的占位符,分别代表日志时间、日志级别、日志标签和日志消息。

5. 日志文件存储

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

注意事项

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

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

回到顶部