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
相关产品推荐
相关产品推荐

