Flutter日志管理插件logger_io的使用

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

Flutter日志管理插件logger_io的使用

简介

logger_io 是一个简单的日志记录器,它实现了日志记录器应有的功能:将输入的消息发送到一系列输出。它比其他日志库(如 logger)更快,因为它只在需要时使用堆栈跟踪,而不是每次记录日志都使用。

logs

使用方法

简单用法

以下是一个简单的示例,展示了如何使用 logger_io 记录不同级别的日志:

import 'package:logger_io/logger_io.dart';

void main() {
  // 创建一个Logger实例
  final logger = Logger();

  // 记录不同级别的日志
  logger.d('debug message');  // 调试信息
  logger.i('info message');   // 信息
  logger.s('success message'); // 成功信息
  logger.w('warning message'); // 警告
  logger.e('error message', stackTrace: StackTrace.current); // 错误,包含堆栈跟踪
}

多个输出

你可以为 Logger 配置多个输出,例如控制台输出和自定义的 Crashlytics 输出:

import 'package:logger_io/logger_io.dart';
import 'package:firebase_crashlytics/firebase_crashlytics.dart';

void main() {
  // 创建一个Logger实例,并配置多个输出
  final logger = Logger(
    outputs: [
      ConsoleOutput(),  // 控制台输出
      MyCrashlyticsOutput(FirebaseCrashlytics.instance),  // 自定义的Crashlytics输出
    ],
  );

  // 记录日志
  logger.i('info message');
}

自定义输出

你可以通过实现 Output 类来自定义日志输出。例如,下面是一个自定义的 Crashlytics 输出类:

import 'package:logger_io/logger_io.dart';
import 'package:firebase_crashlytics/firebase_crashlytics.dart';

class MyCrashlyticsOutput implements Output {
  final FirebaseCrashlytics _crashlytics;

  const MyCrashlyticsOutput(this._crashlytics);

  [@override](/user/override)
  void log({
    required Object? message,
    required Level level,
    required StackTrace? stackTrace,
    required String context,
  }) {
    // 根据日志级别决定是否记录错误或普通日志
    if (level.value >= Level.error.value) {
      _crashlytics.recordError(message, stackTrace ?? StackTrace.current);
    } else {
      _crashlytics.log(message.toString());
    }
  }
}

性能优势

logger_io 的性能优于其他日志库,因为它只在需要时使用堆栈跟踪,而不是每次记录日志都使用。以下是性能对比的示例:

// logger_io的日志记录时间(20次调试日志,5次测试)
Durations for logger_io, 20 debug log (5 times): (1 ms, 2 ms, 2 ms, 1 ms, 2 ms)

// 其他日志库的日志记录时间(20次调试日志,5次测试)
Duration for logger, 20 debug log (5 times): (15 ms, 16 ms, 16 ms, 16 ms, 13 ms)

完整示例Demo

以下是一个完整的示例,展示了如何根据环境配置不同的日志输出:

import 'package:logger_io/logger_io.dart';
import 'package:firebase_crashlytics/firebase_crashlytics.dart';

void main() {
  // 创建一个默认的Logger实例
  final logger = Logger();
  logger.d('debug message');
  logger.i('info message');
  logger.s('success message');
  logger.w('warning message');
  logger.e('error message', stackTrace: StackTrace.current);

  // 根据环境配置不同的日志输出
  final env = 'dev';  // 环境变量,可以是 'dev' 或 'prod'
  final envLogger = Logger(
    context: env,  // 设置上下文
    outputs: [
      if (env == 'dev') ConsoleOutput(),  // 如果是开发环境,使用控制台输出
      MyCrashlyticsOutput(FirebaseCrashlytics.instance),  // 使用自定义的Crashlytics输出
    ],
  );

  // 记录信息日志
  envLogger.i('info message in $env environment');
}

// 自定义的Crashlytics输出类
class MyCrashlyticsOutput implements Output {
  final FirebaseCrashlytics _crashlytics;

  const MyCrashlyticsOutput(this._crashlytics);

  [@override](/user/override)
  void log({
    required Object? message,
    required Level level,
    required StackTrace? stackTrace,
    required String context,
  }) {
    // 根据日志级别决定是否记录错误或普通日志
    if (level.value >= Level.error.value) {
      _crashlytics.recordError(message, stackTrace ?? StackTrace.current);
    } else {
      _crashlytics.log(message.toString());
    }
  }
}

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

1 回复

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


当然,以下是如何在Flutter项目中使用logger_io插件来进行日志管理的代码示例。logger_io是一个流行的日志管理插件,它允许你以结构化的方式记录日志,并支持多种输出目标,比如控制台、文件等。

1. 添加依赖

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

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

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

2. 配置Logger

在你的应用程序的入口文件(通常是main.dart)中配置Logger。以下是一个基本的配置示例:

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

void main() {
  // 配置Logger
  final Logger logger = Logger(
    printers: [
      // 打印到控制台
      PrettyPrinter(
        methodCount: 2, // 打印调用堆栈的深度
        errorMethodCount: 8, // 错误调用堆栈的深度
        lineLength: 120, // 每行的最大长度
        colors: true, // 是否使用颜色
        printEmojis: true, // 是否打印表情符号
        printTime: true, // 是否打印时间戳
      ),
      // 可以添加其他Printer,比如FilePrinter来记录到文件
    ],
  );

  // 将Logger实例设置为全局可访问(可选)
  Log.logger = logger;

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Logger IO Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () {
              // 使用Logger记录日志
              Log.i('This is an info log');
              Log.w('This is a warning log');
              Log.e('This is an error log');
            },
            child: Text('Log Messages'),
          ),
        ),
      ),
    );
  }
}

3. 使用Logger

在应用程序的任何地方,你都可以使用Log类来记录日志。例如:

void someFunction() {
  Log.d('This is a debug log');
  Log.v('This is a verbose log');

  try {
    // 可能会抛出异常的代码
  } catch (e, stackTrace) {
    Log.e('An error occurred', e, stackTrace);
  }
}

4. 输出到文件(可选)

如果你希望将日志输出到文件,可以添加一个FilePrinter。以下是如何配置FilePrinter的示例:

import 'dart:io';
import 'package:path_provider/path_provider.dart';
import 'package:logger_io/logger_io.dart';

void main() async {
  // 获取应用文档目录
  final Directory appDocDir = await getApplicationDocumentsDirectory();
  final String logFilePath = '${appDocDir.path}/app.log';

  // 配置Logger
  final Logger logger = Logger(
    printers: [
      PrettyPrinter(
        // ... 配置选项与上面相同 ...
      ),
      FilePrinter(
        logFile: File(logFilePath),
        outputFormat: OutputFormat.json, // 或者OutputFormat.plain
      ),
    ],
  );

  Log.logger = logger;

  runApp(MyApp());
}

在这个示例中,日志将被记录到应用程序的文档目录中的app.log文件。你可以根据需要调整OutputFormat

总结

通过以上步骤,你可以在Flutter项目中配置和使用logger_io插件来进行日志管理。这不仅有助于调试,还可以在发布应用时收集有用的运行时信息。

回到顶部