Flutter日志记录插件ilogger的使用

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

Flutter日志记录插件ilogger的使用

简介

该插件提供了构建日志记录器的简单接口,大致模仿了NLog。

此包的目的不是成为你的日志记录解决方案。它的目的是只提供常见的接口以供代码使用。你应该能够在不同的项目之间传递ILogger对象,如果它们遵循这个接口。

ILogger接口

ILogger接口定义如下。它包含了许多默认实现:

abstract class ILogger implements ISuppress {
  /// 名称
  String get name;

  /// 是否在[LogLevel.trace]级别启用日志记录
  bool get isTraceEnabled;

  /// 是否在[LogLevel.debug]级别启用日志记录
  bool get isDebugEnabled;

  /// 是否在[LogLevel.info]级别启用日志记录
  bool get isInfoEnabled;

  /// 是否在[LogLevel.warn]级别启用日志记录
  bool get isWarnEnabled;

  /// 是否在[LogLevel.error]级别启用日志记录
  bool get isErrorEnabled;

  /// 是否在[LogLevel.fatal]级别启用日志记录
  bool get isFatalEnabled;

  /// 检查是否在此日志记录器上启用了给定的[LogLevel]
  bool isEnabled(LogLevel level);

  /// 在给定的[LogLevel]级别写入诊断消息
  void log(dynamic message, {required LogLevel level, Exception? exception, Map<String, dynamic>? eventProperties});

  /// 在[LogLevel.trace]级别写入诊断消息
  void trace(dynamic message, {Exception? exception, Map<String, dynamic>? eventProperties});

  /// 在[LogLevel.debug]级别写入诊断消息
  void debug(dynamic message, {Exception? exception, Map<String, dynamic>? eventProperties});

  /// 在[LogLevel.info]级别写入诊断消息
  void info(dynamic message, {Exception? exception, Map<String, dynamic>? eventProperties});

  /// 在[LogLevel.warn]级别写入诊断消息
  void warn(dynamic message, {Exception? exception, Map<String, dynamic>? eventProperties});

  /// 在[LogLevel.error]级别写入诊断消息
  void error(dynamic message, {Exception? exception, Map<String, dynamic>? eventProperties});

  /// 在[LogLevel.fatal]级别写入诊断消息
  void fatal(dynamic message, {Exception? exception, Map<String, dynamic>? eventProperties});

  /// 运行操作。
  ///
  /// 如果操作抛出异常,则该异常将记录为错误级别。异常不会传播到方法外部。
  [@override](/user/override)
  void swallow(Function action) {}

  /// 运行提供的函数并返回其结果。
  ///
  /// 如果抛出异常,则该异常将记录为错误级别。异常不会传播到方法外部。
  ///
  /// 返回回退值。
  [@override](/user/override)
  T? swallowResult<T>(T? Function() action, [T? fallbackValue]) {
    return null;
  }

  /// 运行异步操作。
  ///
  /// 如果操作抛出异常,则该异常将记录为错误级别。异常不会传播到方法外部。
  [@override](/user/override)
  Future<void> swallowAsync(Function action) async {
    return;
  }

  /// 运行提供的异步函数并返回其结果。
  ///
  /// 如果抛出异常,则该异常将记录为错误级别。异常不会传播到方法外部。
  ///
  /// 返回回退值。
  [@override](/user/override)
  Future<T?> swallowResultAsync<T>(Future<T?> Function() action, T? fallbackValue) async {
    return null;
  }
}

你应该始终考虑实现log方法。其他方法可以根据你的需要来实现。

使用

虽然这个包不打算作为一个实际的日志记录解决方案,但它包括两个非常简单的日志记录器实现,以便让你快速上手:

  • BasicConsoleLogger
  • BasicNullLogger

BasicConsoleLogger 包含大多数方法的简单实现,并将通过 print 方法将未经过滤的消息打印到控制台:

void printLog() {
    final simpleLogger = BasicConsoleLogger(name: 'mySimpleLogger');
    simpleLogger.info('A simple message'); // [2023-09-12T16:47:32+5:00] INFO A Simple message ||
}

BasicNullLogger 将丢弃所有消息且不会打印任何内容:

void printLog() {
    final simpleLogger = BasicConsoleLogger(name: 'myNullLogger');
    simpleLogger.info('A simple message'); // nothing will be printed at all, this is a NOP
}

建议你基于这些接口合同构建自己的更复杂日志记录器。对于一个稍微高级一点的例子,可以查看 DLog Basic 仓库,其中包含了一个工作版本的简化版NLog。

完整示例

以下是一个完整的示例,展示了如何使用ILogger接口创建自定义日志记录器:

import 'package:ilogger/ilogger.dart';

// 自定义日志记录器
final class SampleLogger extends ILogger {
  [@override](/user/override)
  String get name => "sample";

  [@override](/user/override)
  bool get isDebugEnabled => true;

  [@override](/user/override)
  bool get isErrorEnabled => true;

  [@override](/user/override)
  bool get isFatalEnabled => true;

  [@override](/user/override)
  bool get isInfoEnabled => true;

  [@override](/user/override)
  bool get isTraceEnabled => true;

  [@override](/user/override)
  bool get isWarnEnabled => true;

  [@override](/user/override)
  bool isEnabled(LogLevel level) => true;

  [@override](/user/override)
  void debug(message,
      {Exception? exception, Map<String, dynamic>? eventProperties}) {
    log(message,
        level: LogLevel.debug,
        exception: exception,
        eventProperties: eventProperties);
  }

  [@override](/user/override)
  void error(message,
      {Exception? exception, Map<String, dynamic>? eventProperties}) {
    log(message,
        level: LogLevel.error,
        exception: exception,
        eventProperties: eventProperties);
  }

  [@override](/user/override)
  void fatal(message,
      {Exception? exception, Map<String, dynamic>? eventProperties}) {
    log(message,
        level: LogLevel.fatal,
        exception: exception,
        eventProperties: eventProperties);
  }

  [@override](/user/override)
  void info(message,
      {Exception? exception, Map<String, dynamic>? eventProperties}) {
    log(message,
        level: LogLevel.info,
        exception: exception,
        eventProperties: eventProperties);
  }

  [@override](/user/override)
  void trace(message,
      {Exception? exception, Map<String, dynamic>? eventProperties}) {
    log(message,
        level: LogLevel.trace,
        exception: exception,
        eventProperties: eventProperties);
  }

  [@override](/user/override)
  void warn(message,
      {Exception? exception, Map<String, dynamic>? eventProperties}) {
    log(message,
        level: LogLevel.warn,
        exception: exception,
        eventProperties: eventProperties);
  }

  [@override](/user/override)
  void log(message,
      {required LogLevel level,
      Exception? exception,
      Map<String, dynamic>? eventProperties}) {
    print('${DateTime.now()} [$level] $message |$exception|$eventProperties');
  }
}

void main() {
  final ILogger logger = SampleLogger();

  logger.info('Running example from `main` at the info level');
  logger.error('Showing a sample error', exception: Exception('An error'));
  logger.trace(
    'Showing event properties at the trace level',
    eventProperties: {
      '1+1': 2,
      'dogsOrCats': 'both',
      'isItTrue': true,
      'extraArr': ['a', 'b', 'c'],
      'extraObj': {
        'fieldA': 0,
        'fieldB': 1,
      }
    },
  );
}

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

1 回复

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


当然,以下是一个关于如何在Flutter项目中使用ilogger插件进行日志记录的代码示例。ilogger是一个流行的Flutter日志记录库,它提供了灵活且强大的日志记录功能。

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

dependencies:
  flutter:
    sdk: flutter
  ilogger: ^0.6.0  # 请检查最新版本号

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

接下来,在你的Flutter项目中配置和使用ilogger。以下是一个简单的示例,展示了如何设置日志记录器并在应用中记录不同级别的日志。

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

void main() {
  // 初始化ilogger
  Logger.level = LogLevel.verbose; // 设置日志级别
  Logger.logToFile = true; // 是否将日志写入文件(仅适用于非Web平台)
  Logger.logFilePath = './ilogger.log'; // 设置日志文件路径(仅适用于非Web平台)
  Logger.maxLogFileSize = 1024 * 1024; // 设置日志文件最大大小(仅适用于非Web平台)
  Logger.logToConsole = true; // 是否将日志输出到控制台

  // 创建Flutter应用
  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();

    // 记录不同级别的日志
    Logger.verbose('This is a verbose log message.');
    Logger.debug('This is a debug log message.');
    Logger.info('This is an info log message.');
    Logger.warn('This is a warning log message.');
    Logger.error('This is an error log message.');
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Demo Home Page'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Check the console or log file for logged messages.',
            ),
          ],
        ),
      ),
    );
  }
}

在这个示例中,我们做了以下几件事:

  1. main函数中初始化ilogger,设置日志级别、日志文件路径、是否将日志写入文件和输出到控制台等配置。
  2. MyHomePageinitState方法中,记录了几条不同级别的日志消息。
  3. 运行时,这些日志消息会根据配置输出到控制台或写入日志文件(在非Web平台上)。

请注意,日志文件路径和日志大小限制等配置在非Web平台上才有效。如果你在Web平台上运行此代码,请适当调整日志配置。

此外,ilogger还支持自定义日志格式和异步日志记录等高级功能,你可以根据需求查阅其官方文档以获取更多信息。

回到顶部