You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中使用logger包实现日志文件存储与下载

实现步骤

1. 添加必要依赖

在pubspec.yaml中引入所需包:

dependencies:
  logger: ^2.0.2+1  // 可替换为最新版本
  path_provider: ^2.1.1
  permission_handler: ^10.2.0
  share_plus: ^7.2.2  // 用于导出日志文件

2. 自定义文件输出适配器

创建FileLogOutput类,继承LogOutput实现日志写入文件逻辑:

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

class FileLogOutput extends LogOutput {
  late File _logFile;

  @override
  Future<void> init() async {
    super.init();
    // 获取应用专属文档目录
    final directory = await getApplicationDocumentsDirectory();
    _logFile = File('${directory.path}/app_logs.txt');
    // 初始化日志文件(不存在则创建)
    if (!await _logFile.exists()) {
      await _logFile.create();
    }
  }

  @override
  void output(OutputEvent event) {
    final time = DateTime.now().toString();
    // 逐条写入日志,包含时间、级别和内容
    for (var line in event.lines) {
      final logLine = '[$time] [${event.level.name}] $line\n';
      _logFile.writeAsString(logLine, mode: FileMode.append, flush: true);
    }
  }
}

3. 全局配置Logger

在应用初始化时配置Logger,同时保留控制台输出和文件输出,确保release模式下正常工作:

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

late Logger logger;

void setupLogger() async {
  logger = Logger(
    level: Level.verbose,  // 全级别日志输出,release模式不受影响
    printer: PrettyPrinter(
      methodCount: 0,  // 减少冗余栈信息,按需调整
      colors: false,  // 文件输出不需要颜色标记
      printEmojis: false,
    ),
    output: MultiOutput([
      ConsoleOutput(),  // 保留控制台打印
      FileLogOutput(),  // 启用文件写入
    ]),
  );
}

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await setupLogger();
  runApp(const MyApp());
}

4. 处理存储权限

Android端

在AndroidManifest.xml中添加权限:

<!-- Android 12及以下 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!-- Android 13+ -->
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />

代码中申请权限:

import 'package:permission_handler/permission_handler.dart';

Future<bool> requestStoragePermission() async {
  final status = await Permission.storage.request();
  return status.isGranted;
}

iOS端

在Info.plist中添加权限说明:

<key>NSDocumentFolderUsageDescription</key>
<string>需要访问文档目录存储日志文件</string>

5. 实现日志导出功能

通过share_plus包将日志文件分享给用户,支持保存到本地或其他应用:

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

Future<void> exportLogFile() async {
  final directory = await getApplicationDocumentsDirectory();
  final logFile = File('${directory.path}/app_logs.txt');
  
  if (await logFile.exists()) {
    await Share.shareXFiles([XFile(logFile.path)], text: '应用日志文件');
  }
}

在UI中添加触发按钮:

ElevatedButton(
  onPressed: exportLogFile,
  child: const Text('导出日志'),
)

注意事项

  • Release模式适配: Logger的自定义输出不受Flutter release模式下print禁用的影响,只要level设置正确即可正常写入文件。
  • 日志文件管理: 可添加文件大小检测逻辑,超过阈值时自动创建新日志文件,避免占用过多存储。
  • 异步写入: 日志写入为异步操作,不会阻塞主线程,大量日志场景可考虑添加队列优化。

内容的提问来源于stack exchange,提问作者Ana

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 08:16:00