Flutter日志收集插件logging_collector的使用

Flutter日志收集插件logging_collector的使用

logging_collector 是一个简单的 Flutter 包,用于将日志记录到文件并共享日志。以下是详细的使用步骤。

设置日志目录

首先,我们需要设置日志存储的目录:

import 'package:path_provider/path_provider.dart';

final Directory docsDirectory = await getApplicationDocumentsDirectory();

final logsDirectoryPath = '${docsDirectory.path}/logs';
final logsDirectory = Directory(logsDirectoryPath);
logsDirectory.createSync();

创建 RollingFileAppender

接下来,我们创建一个 RollingFileAppender,它会将日志消息写入指定的日志目录:

import 'package:logging_collector/logging_collector.dart';

final appenders = [
  RollingFileAppender(
    directoryPath: logsDirectoryPath,
    fileMaxSize: 1024 * 1024, // 文件最大大小为1MB
    fileMaxCount: 3, // 最多保留3个文件
  ),
];

使用 RollingFileAppender 进行日志记录

然后,我们需要配置日志记录器以使用 RollingFileAppender

import 'package:logging/logging.dart';

Logger.root.level = Level.ALL; // 设置日志级别

Logger.root.onRecord.listen(
  (LogRecord record) async {
    String log;
    if (record.error != null) {
      log = '${record.level.name}: ${record.time}: ${record.loggerName}: '
          '${record.message}: ${record.error}\n'
          'stackTrace\n${record.stackTrace}\n';
    } else {
      log = '${record.level.name}: ${record.time}: ${record.loggerName}: '
          '${record.message}\n';
    }

    for (final appender in appenders) {
      await appender.append(log);
    }
  },
);

创建 LoggingCollectorConfig 并运行应用

最后,我们需要创建 LoggingCollectorConfig 并在应用中使用它:

import 'package:logging_collector/logging_collector.dart';

final loggingCollectorConfig = LoggingCollectorConfig(
  logsDirectoryPath,
  _CustomSharingDelegate(logsDirectory),
);

runApp(
  Provider<LoggingCollectorConfig>.value(
    value: loggingCollectorConfig,
    child: const MyApp(),
  ),
);

实现自定义的日志共享逻辑

为了实现日志共享功能,我们需要实现 LogsSharingDelegate 接口:

import 'package:archive/archive_io.dart';
import 'package:share_plus/share_plus.dart';

class _CustomSharingDelegate implements LogsSharingDelegate {
  final Directory _logsDirectory;

  _CustomSharingDelegate(this._logsDirectory);

  [@override](/user/override)
  Future<void> share() async {
    final zipEncoder = ZipFileEncoder();
    final zipPath = '../${_logsDirectory.path}/logs.zip';
    zipEncoder.zipDirectory(
      _logsDirectory,
      filename: zipPath,
    );

    Share.shareXFiles(
      [XFile(zipPath)],
      subject: 'Share',
      text: 'Share logs',
    );
  }
}

完整示例代码

以下是一个完整的示例代码,展示了如何使用 logging_collector 插件:

import 'dart:async';
import 'dart:io';
import 'dart:math';

import 'package:archive/archive_io.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:logging/logging.dart';
import 'package:logging_collector/logging_collector.dart';
import 'package:path_provider/path_provider.dart';
import 'package:provider/provider.dart';
import 'package:share_plus/share_plus.dart';

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // 设置日志目录
  final Directory docsDirectory = await getApplicationDocumentsDirectory();
  final logsDirectoryPath = '${docsDirectory.path}/logs';
  final logsDirectory = Directory(logsDirectoryPath);
  logsDirectory.createSync();

  // 创建 RollingFileAppender
  final appenders = [
    RollingFileAppender(
      directoryPath: logsDirectoryPath,
      fileMaxSize: 1024 * 1024, // 文件最大大小为1MB
      fileMaxCount: 3, // 最多保留3个文件
    ),
  ];

  // 配置日志记录器
  Logger.root.level = Level.ALL;

  Logger.root.onRecord.listen(
    (LogRecord record) async {
      String log;
      if (record.error != null) {
        log = '${record.level.name}: ${record.time}: ${record.loggerName}: '
            '${record.message}: ${record.error}\n'
            'stackTrace\n${record.stackTrace}\n';
      } else {
        log = '${record.level.name}: ${record.time}: ${record.loggerName}: '
            '${record.message}\n';
      }

      for (final appender in appenders) {
        await appender.append(log);
      }
    },
  );

  // 创建 LoggingCollectorConfig
  final loggingCollectorConfig = LoggingCollectorConfig(
    logsDirectoryPath,
    _CustomSharingDelegate(logsDirectory),
  );

  runApp(
    Provider<LoggingCollectorConfig>.value(
      value: loggingCollectorConfig,
      child: const MyApp(),
    ),
  );
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final _logger = Logger('MyApp');

  [@override](/user/override)
  void initState() {
    super.initState();
    Timer.periodic(
      const Duration(seconds: 2),
      (timer) {
        _logger.fine('message id ${Random().nextDouble()}');
      },
    );
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.green),
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatelessWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(title),
      ),
      body: const Placeholder(),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          Navigator.of(context).push(
            CupertinoPageRoute(
                builder: (context) => LoggingCollectorWidget(context.read())),
          );
        },
        child: const Icon(Icons.add),
      ),
    );
  }
}

class _CustomSharingDelegate implements LogsSharingDelegate {
  final Directory _logsDirectory;

  _CustomSharingDelegate(this._logsDirectory);

  [@override](/user/override)
  Future<void> share() async {
    final zipEncoder = ZipFileEncoder();
    final zipPath = '../${_logsDirectory.path}/logs.zip';
    zipEncoder.zipDirectory(
      _logsDirectory,
      filename: zipPath,
    );

    Share.shareXFiles(
      [XFile(zipPath)],
      subject: 'Share',
      text: 'Share logs',
    );
  }
}

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

1 回复

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


logging_collector 是一个用于 Flutter 应用的日志收集插件,它可以帮助开发者更方便地收集和管理应用中的日志信息。以下是 logging_collector 插件的使用步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  logging_collector: ^1.0.0  # 请使用最新版本

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

2. 初始化日志收集器

在你的 Flutter 应用的入口文件(通常是 main.dart)中,初始化 LoggingCollector

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // 初始化日志收集器
  await LoggingCollector.initialize(
    maxLogFileSize: 1024 * 1024, // 最大日志文件大小(字节),默认为 1MB
    maxLogFiles: 5, // 最大日志文件数量,默认为 5
    logDirectory: 'logs', // 日志存储目录,默认为 'logs'
  );

  runApp(MyApp());
}

3. 记录日志

在你的应用中,你可以使用 LoggingCollector 来记录日志。以下是一些常见的日志记录方式:

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Logging Collector Example')),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              ElevatedButton(
                onPressed: () {
                  LoggingCollector.log('This is a debug message', level: LogLevel.debug);
                },
                child: Text('Log Debug'),
              ),
              ElevatedButton(
                onPressed: () {
                  LoggingCollector.log('This is an info message', level: LogLevel.info);
                },
                child: Text('Log Info'),
              ),
              ElevatedButton(
                onPressed: () {
                  LoggingCollector.log('This is a warning message', level: LogLevel.warning);
                },
                child: Text('Log Warning'),
              ),
              ElevatedButton(
                onPressed: () {
                  LoggingCollector.log('This is an error message', level: LogLevel.error);
                },
                child: Text('Log Error'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

4. 查看日志

日志文件会存储在应用的文档目录下的 logs 文件夹中。你可以通过以下方式获取日志文件路径并查看日志内容:

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

Future<void> viewLogs() async {
  Directory appDocDir = await getApplicationDocumentsDirectory();
  Directory logDir = Directory('${appDocDir.path}/logs');

  if (await logDir.exists()) {
    logDir.list().forEach((entity) {
      if (entity is File) {
        print('Log file: ${entity.path}');
        // 读取日志文件内容
        entity.readAsString().then((contents) {
          print('Log contents: $contents');
        });
      }
    });
  } else {
    print('Log directory does not exist');
  }
}

5. 清理日志

你还可以通过 LoggingCollector 提供的清理方法来删除旧的日志文件:

await LoggingCollector.cleanLogs();

6. 自定义日志级别

LoggingCollector 支持自定义日志级别,你可以根据需求设置不同的日志级别:

enum LogLevel {
  debug,
  info,
  warning,
  error,
}
回到顶部