Flutter日志管理插件proxima_logger的使用

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

Flutter日志管理插件proxima_logger的使用


简介

proxima_logger_logo

强大的日志管理插件proxima_logger

这是一款易于使用且可定制的日志管理插件,可以打印出美观的日志信息。它支持多种自定义选项和样式,让你能够根据需求调整日志输出。


开始使用

1. 添加插件到项目

pubspec.yaml文件中添加插件:

dependencies:
  proxima_logger: ^x.x.x

然后运行以下命令来安装插件:

dart pub get

2. 创建一个proxima_logger实例

你可以通过设置一些通用的参数来创建一个proxima_logger实例,如日志部分的顺序、边框样式等。

final logger = ProximaLogger(
  settings: (logType) => switch (logType) {
    Log.debug => const LogSettings(
        logParts: [
          LogPart.stack,
          LogPart.message,
        ],
        logDecorations: LogDecorations.rounded(),
      ),
    Log.error => const LogSettings(
        logDecorations: LogDecorations.thick(),
      ),
    Log.wtf || Log.nothing => const LogSettings(
        logDecorations: LogDecorations.thin(),
      ),
    _ => const LogSettings(
        logParts: [
          LogPart.stack,
          LogPart.error,
          LogPart.time,
          LogPart.divider,
          LogPart.message,
        ],
        printEmoji: true,
        printTitle: true,
        printLogTypeLabel: true,
      ),
  }
);

使用方法

你可以在程序的任何地方使用logger.log()或其便捷方法如logger.info, logger.warning, logger.error等来记录日志。

// 记录信息日志
logger.log(
  Log.info,
  title: 'Log title',
);

// 记录调试日志
logger.debug(message: 'Debug message');

// 捕获异常并记录错误日志
try {
  // 你的代码
} catch (e, s) {
  logger.error(
    title: 'Some error',
    error: e,
    stack: s,
  );
}

错误处理

为了自动处理错误,你可以在main()函数中添加runZonedGuarded()方法。

void main() {
  bool recordError(Object error, StackTrace stackTrace) {
    logger.log(Log.error, error: error, stack: stackTrace);
    return true;
  }

  void recordFlutterError(FlutterErrorDetails error) {
    logger.log(Log.error, error: error, stack: error.stack);
  }

  FlutterError.onError = recordFlutterError;
  PlatformDispatcher.instance.onError = recordError;

  runApp(const MyApp());
}

自定义日志类型

你可以创建自己的日志类型,并将其集成到proxima_logger中。

enum Log implements ILogType {
  custom(
    label: 'custom',
    emoji: '🦄',
    ansiPen: AnsiPen.purple(),
  );

  [@override](/user/override)
  final String label;
  [@override](/user/override)
  final String emoji;
  [@override](/user/override)
  final AnsiPen ansiPen;
  [@override](/user/override)
  final AnsiPen ansiPenOnBackground;

  const Log({
    required this.label,
    required this.emoji,
    required this.ansiPen,
    this.ansiPenOnBackground = const AnsiPen.black(),
  });
}

日志输出示例

image

image


完整示例代码

下面是一个完整的示例代码,展示了如何使用proxima_logger来记录各种类型的日志。

import 'package:dio/dio.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';

import 'logger.dart' show Log;

import 'logger.dart' show logger;
//or
//import 'logger_custom.dart' show logger;

import 'src/large_nesting_widget.dart';
import 'src/model.dart';

void main() {
  bool recordError(Object error, StackTrace stackTrace) {
    logger.log(Log.error, error: error, stack: stackTrace);
    return true;
  }

  void recordFlutterError(FlutterErrorDetails error) {
    logger.log(Log.error, error: error, stack: error.stack);
  }

  FlutterError.onError = recordFlutterError;
  PlatformDispatcher.instance.onError = recordError;

  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return const MaterialApp(
      home: HomePage(),
    );
  }
}

class HomePage extends StatefulWidget {
  const HomePage({Key? key}) : super(key: key);

  [@override](/user/override)
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  bool b = false;
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ElevatedButton(
              onPressed: () {
                logger.log(
                  Log.info,
                  title: 'Info Title',
                  error: Exception('wepijfowief'),
                );
              },
              child: const Text('info'),
            ),
            const SizedBox(height: 10),
            ElevatedButton(
              onPressed: () {
                logger.log(
                  Log.debug,
                  message: 'Debug message',
                );
              },
              child: const Text('debug'),
            ),
            const SizedBox(height: 10),
            ElevatedButton(
              onPressed: () {
                logger.log(
                  Log.warning,
                  error: Exception('warning'),
                );
              },
              child: const Text('warning'),
            ),
            const SizedBox(height: 10),
            ElevatedButton(
              onPressed: () {
                try {
                  throw Exception('Error');
                } catch (e, s) {
                  logger.log(
                    Log.error,
                    title: 'ElevatedButton error',
                    error: e,
                    stack: s,
                  );
                }
              },
              child: const Text('error'),
            ),
            const SizedBox(height: 10),
            ElevatedButton(
              onPressed: () {
                logger.log(
                  Log.wtf,
                );
              },
              child: const Text('wtf'),
            ),
            const SizedBox(height: 10),
            ElevatedButton(
              onPressed: () {
                logger.log(
                  Log.wtf,
                  title: 'Task json',
                  error: Exception('WTF EXCEPTION'),
                  message: Task.random().toMap(),
                );
              },
              child: const Text('json'),
            ),
            const SizedBox(height: 10),
            ElevatedButton(
              onPressed: () {
                setState(() {
                  b = !b;
                });
              },
              child: const Text('exception'),
            ),
            const SizedBox(height: 10),
            ElevatedButton(
              onPressed: () async {
                final response = await Dio(
                  BaseOptions(
                    baseUrl: 'https://realty.neirodev.ru/mehanik/',
                    connectTimeout: const Duration(seconds: 10),
                  ),
                ).get(
                  '/partAnnouncements',
                  queryParameters: {
                    'pageNum': 0,
                    'pageSize': 1,
                  },
                );
                logger.log(
                  Log.response,
                  title:
                      '| ${response.requestOptions.method} | ${response.statusCode} | ${response.requestOptions.path}',
                  message: response.data,
                );
              },
              child: const Text('request'),
            ),
            if (b) const LargeNestingWidget(),
          ],
        ),
      ),
    );
  }
}

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

1 回复

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


当然,以下是如何在Flutter项目中使用proxima_logger插件进行日志管理的示例代码。proxima_logger是一个功能强大的日志管理库,支持多种日志级别和日志输出目标(如控制台、文件等)。

1. 添加依赖

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

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

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

2. 初始化Logger

在你的Flutter应用的入口文件(通常是main.dart)中初始化Logger实例:

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

void main() {
  // 初始化Logger
  final logger = Logger(
    level: LogLevel.verbose,  // 设置日志级别
    printToConsole: true,     // 是否输出到控制台
    writeToFile: true,        // 是否写入文件
    fileName: 'app_log.txt',  // 日志文件名
    maxFileSize: 1024 * 1024, // 最大文件大小(字节)
    maxFileCount: 5,          // 最大文件数量
  );

  // 配置全局Logger
  Logger.global = logger;

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Proxima Logger Demo'),
        ),
        body: Center(
          child: LogButton(),
        ),
      ),
    );
  }
}

class LogButton extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ElevatedButton(
      onPressed: () {
        // 使用全局Logger记录日志
        Logger.global.v('This is a verbose log message.');
        Logger.global.d('This is a debug log message.');
        Logger.global.i('This is an info log message.');
        Logger.global.w('This is a warning log message.');
        Logger.global.e('This is an error log message.');

        // 你也可以直接使用实例记录日志
        // logger.v('Another verbose log message.');
      },
      child: Text('Log Messages'),
    );
  }
}

3. 运行应用

运行你的Flutter应用,点击按钮后,你应该能在控制台看到日志输出,并且如果writeToFile设置为true,日志也会被写入到指定的文件中。

4. 日志级别

proxima_logger支持以下日志级别:

  • LogLevel.verbose
  • LogLevel.debug
  • LogLevel.info
  • LogLevel.warning
  • LogLevel.error

你可以通过修改Logger实例的level属性来控制记录的最低日志级别。例如,如果你将级别设置为LogLevel.warning,则只会记录warningerror级别的日志。

5. 自定义日志格式

你还可以自定义日志格式,通过实现LogFormatter接口:

class MyLogFormatter implements LogFormatter {
  @override
  String format(LogRecord record) {
    return '${record.timestamp} [${record.level}] ${record.message}';
  }
}

// 使用自定义格式化器
final logger = Logger(
  level: LogLevel.verbose,
  printToConsole: true,
  writeToFile: true,
  fileName: 'app_log.txt',
  formatter: MyLogFormatter(),
);

这样,你就可以根据自己的需求自定义日志的输出格式了。

通过上述步骤,你就可以在Flutter项目中使用proxima_logger插件进行日志管理了。

回到顶部