Flutter日志记录插件logging_flutter的使用

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

Flutter日志记录插件logging_flutter的使用

Overview

logging_flutterlogging 包的 Flutter 扩展。它提供了一种简单的方法来在应用程序中记录日志,并附带了一些额外的工具。

Features

  • 使用标准格式将日志打印到控制台。
  • 将日志发送到第三方服务(如 Crashlytics、DataDog 等)。
  • 打印触发日志的类和方法名称。
  • 在应用内查看和分享所有日志。
  • 捕获和格式化来自第三方包的 logging 日志。

Get Started

Initializing

使用 Flogger 静态类访问所有日志记录方法。

  1. 初始化日志记录器。

    Flogger.init();
    
  2. 注册一个监听器,将日志打印到开发人员控制台。

    if (kDebugMode) {
      Flogger.registerListener(
        (record) => log(record.printable(), stackTrace: record.stackTrace),
      );
    }
    

Logging messages

使用以下方法记录不同严重程度的消息:

Flogger.d("Debug message");
Flogger.i("Info message");
Flogger.w("Warning message");
Flogger.e("Error message", stackTrace: null);

这些调用在使用默认配置时将生成以下日志:

[log] D/App SampleClass: Debug message
[log] I/App SampleClass: Info message
[log] W/App SampleClass: Warning message
[log] E/App SampleClass: Error message

Advanced Usage

Configuration

初始化 Flogger 时使用 FloggerConfig 类来配置日志的打印方式:

Flogger.init(config: FloggerConfig(
  loggerName: "App",
  printClassName: true,
  printMethodName: false,
  showDateTime: false,
  showDebugLogs: true,
  printer: null, // 如果设置,则忽略所有其他打印选项
));

Viewing logs inside the app

使用 LogConsole 类在应用内查看日志。

  1. 通过注册新的监听器将日志添加到控制台缓冲区。

    Flogger.registerListener(
      (record) => LogConsole.add(
        OutputEvent(record.level, [record.printable()]),
        bufferSize: 1000, // 记录最后 X 条日志
      ),
    );
    
  2. 打开日志控制台以查看所有记录的日志。

    LogConsole.open(context)
    

Multiple Loggers

使用 loggerName 参数记录日志时,可以将其作为不同的记录器打印。这对于区分应用程序不同层中的调用非常有用。

Flogger.i("Info message", loggerName: "Network");
Flogger.w("Warning message", loggerName: "Database");

Logging to 3rd party services

注册额外的监听器,将日志发送到不同的服务。

if (kReleaseMode) {
  Flogger.registerListener((record) {
    // 过滤可能包含敏感数据的日志
    if (record.loggerName != "App") return;
    if (record.message.contains("apiKey")) return;
    if (record.message.contains("password")) return;
    // 将日志发送到第三方服务
    FirebaseCrashlytics.instance.log(record.printable());
    DatadogSdk.instance.logs?.info(record.printable());
  });
}

Contributing

欢迎贡献!请随时打开一个新的问题或拉取请求来改进此项目。

Deployment

  1. pubspec.yaml 文件中设置新版本号。
  2. 更新 CHANGELOG.md 文件,记录更改。
  3. 必要时更新 README.md 文件。
  4. 运行 dart doc 更新文档。
  5. 运行 dart pub publish --dry-run 确保包可以成功发布。
  6. 创建一个带有发布版本的新标签 git tag -a x.y.z -m "x.y.z" && git push --tags
  7. 导航到 GitHub Releases 并为之前创建的标签创建一个新的发布,包括 CHANGELOG.md 中的更改。
  8. 最后运行 dart pub publish 发布项目。

Credits

License

本仓库受 MIT License 保护。

示例代码

import 'dart:async';
import 'dart:developer';

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:logging/logging.dart';
import 'package:logging_flutter/logging_flutter.dart';

class SampleClass {
  final String name;
  final int id;

  SampleClass({
    required this.name,
    required this.id,
  });

  static void printSomeLogs() {
    Flogger.d("Debug message");

    Flogger.i("Info message");
    Flogger.i("Info message with object - ${SampleClass(name: "John", id: 1)}");

    Flogger.w("Warning message");
    try {
      throw Exception("Something bad happened");
    } catch (e) {
      Flogger.w("Warning message with exception $e");
    }

    Flogger.e("Error message with exception - ${Exception("Test Error")}");

    Flogger.i("Info message with a different logger name", loggerName: "Dio");

    // throw Exception("This has been thrown");
  }
}

class ExternalPackage {
  static void printSomeLogs() {
    Logger.root.config("Debug message");

    Logger.root.info("Info message");
    Logger.root.info("Info message with object - ${ExternalPackage()}");

    Logger.root.warning("Warning message");
    try {
      throw Exception("Something bad happened");
    } catch (e) {
      Logger.root.info("Warning message with exception $e");
    }

    Logger.root.severe("Error message with exception - ${Exception("Test Error")}");

    Logger("Isar").info("Info message with a different logger name");

    // throw Exception("This has been thrown");
  }
}

void main() {
  runZonedGuarded(() {
    runApp(MyApp());
    init();
  }, (error, stack) {
    // 捕获并记录崩溃
    Flogger.e('Unhandled error - $error', stackTrace: stack);
  });
}

void init() {
  // 初始化
  Flogger.init(
    config: FloggerConfig(
      printClassName: true,
      printMethodName: true,
      showDateTime: true,
      showDebugLogs: true,
    ),
  );
  if (kDebugMode) {
    // 将日志发送到调试控制台
    Flogger.registerListener(
      (record) => log(record.printable(), stackTrace: record.stackTrace),
    );
  }
  // 将日志发送到应用控制台
  Flogger.registerListener(
    (record) => LogConsole.add(
      OutputEvent(record.level, [record.printable()]),
      bufferSize: 1000, // 记录最后 X 条日志
    ),
  );
  // 您还可以使用 "registerListener" 将日志发送到 Crashlytics 或任何其他服务
  if (kReleaseMode) {
    Flogger.registerListener((record) {
      // 过滤可能包含敏感数据的日志
      if (record.loggerName != "App") return;
      if (record.message.contains("apiKey")) return;
      if (record.message.contains("password")) return;
      // 将日志发送到日志服务
      // FirebaseCrashlytics.instance.log(record.message);
      // DatadogSdk.instance.logs?.info(record.message);
    });
  }
  SampleClass.printSomeLogs();
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      routes: <String, WidgetBuilder>{
        "home": (context) => HomeWidget(),
      },
      initialRoute: "home",
      theme: ThemeData.dark(),
    );
  }
}

class HomeWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          TextButton(
              onPressed: () => SampleClass.printSomeLogs(),
              child: Text("Print some Logs")),
          TextButton(
              onPressed: () => ExternalPackage.printSomeLogs(),
              child: Text("Print some non-flogger Logs")),
          TextButton(
            onPressed: () async {
              await Future.delayed(Duration(milliseconds: 300));
              throw Exception("An exception has been thrown");
            },
            child: Text("Throw Exception"),
          ),
          SizedBox(height: 16),
          Center(
            child: TextButton(
                onPressed: () => LogConsole.open(context),
                child: Text("or click here to open Logs Console")),
          ),
        ],
      ),
    );
  }
}

以上是一个完整的示例,展示了如何使用 logging_flutter 插件进行日志记录。希望这对您有所帮助!


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

1 回复

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


当然,下面是一个关于如何在Flutter项目中使用logging_flutter插件来进行日志记录的代码示例。

首先,确保你已经在pubspec.yaml文件中添加了logging_flutter依赖:

dependencies:
  flutter:
    sdk: flutter
  logging_flutter: ^x.y.z  # 替换为最新的版本号

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

接下来,你可以按照以下步骤在Flutter应用中使用logging_flutter进行日志记录:

  1. 配置Logger

在你的应用的主文件(通常是main.dart)中配置Logger:

import 'package:flutter/material.dart';
import 'package:logging/logging.dart';
import 'package:logging_flutter/logging_flutter.dart';

void main() {
  // 配置Logger
  Logger.root.level = Level.ALL; // 设置日志级别
  Logger.root.onRecord.listen((LogRecord rec) {
    print('${rec.level.name}: ${rec.time}: ${rec.message}');
    // 使用Flutter的日志记录功能
    if (rec.level <= Level.SEVERE) {
      FlutterLogHandler().log(rec);
    }
  });

  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 StatelessWidget {
  final Logger _logger = Logger('MyHomePage');

  @override
  Widget build(BuildContext context) {
    _logger.info('This is an info log from MyHomePage.');
    _logger.warning('This is a warning log from MyHomePage.');
    _logger.severe('This is a severe log from MyHomePage.');

    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Demo Home Page'),
      ),
      body: Center(
        child: Text('Check the console for logs.'),
      ),
    );
  }
}

在这个示例中,我们首先配置了根Logger的级别,并设置了一个监听器来监听日志记录事件。在监听器中,我们打印日志信息,并使用FlutterLogHandler来处理严重级别(SEVERE)及以上的日志,这些日志将会显示在Flutter的开发者控制台中。

  1. 在应用中记录日志

在应用的各个部分中,你可以通过创建Logger实例来记录日志。例如,在上面的MyHomePage类中,我们创建了一个名为MyHomePage的Logger实例,并在build方法中记录了不同级别的日志。

  1. 运行应用并查看日志

运行你的Flutter应用,并在开发者控制台中查看日志输出。你应该能够看到类似以下的日志信息:

INFO: 2023-xx-xx xx:xx:xx.xxx: This is an info log from MyHomePage.
WARNING: 2023-xx-xx xx:xx:xx.xxx: This is a warning log from MyHomePage.
SEVERE: 2023-xx-xx xx:xx:xx.xxx: This is a severe log from MyHomePage.

注意:对于SEVERE级别的日志,由于我们使用了FlutterLogHandler,这些日志将会显示在Flutter的开发者控制台中,而其他级别的日志则只会打印到标准输出。

通过这种方式,你可以在Flutter应用中使用logging_flutter插件来有效地记录和管理日志。

回到顶部