exportLogs static method
导出日志文件到公共目录(需要存储权限)
@param destinationPath 目标路径,如果为 null 则使用 Downloads 目录 @return 导出的文件路径,失败返回 null
Implementation
static Future<String?> exportLogs({String? destinationPath}) async {
if (kIsWeb) {
debugPrint('[DKLog] Web 平台不支持导出日志');
return null;
}
try {
// 检查权限
if (Platform.isAndroid) {
final hasPermission = await hasStoragePermission();
if (!hasPermission) {
final granted = await requestStoragePermission();
if (!granted) {
debugPrint('[DKLog] 导出日志需要存储权限');
return null;
}
}
}
// 获取源日志文件
final logFiles = await getLogFiles();
if (logFiles.isEmpty) {
debugPrint('[DKLog] 没有日志文件可导出');
return null;
}
// 确定目标目录
Directory targetDir;
if (destinationPath != null) {
targetDir = Directory(destinationPath);
} else {
// 使用 Downloads 目录
if (Platform.isAndroid) {
targetDir = Directory('/storage/emulated/0/Download/AppLogs');
} else if (Platform.isIOS) {
// iOS 使用应用的 Documents 目录
final appDir = await getApplicationDocumentsDirectory();
targetDir = Directory('${appDir.path}/ExportedLogs');
} else {
final appDir = await getApplicationDocumentsDirectory();
targetDir = Directory('${appDir.path}/ExportedLogs');
}
}
if (!await targetDir.exists()) {
await targetDir.create(recursive: true);
}
// 创建合并的日志文件
final now = DateTime.now();
final exportFileName =
'exported_logs_${now.year}${now.month.toString().padLeft(2, '0')}${now.day.toString().padLeft(2, '0')}_${now.hour.toString().padLeft(2, '0')}${now.minute.toString().padLeft(2, '0')}.log';
final exportFile = File('${targetDir.path}/$exportFileName');
final sink = exportFile.openWrite();
// 写入导出信息
sink.writeln('=' * 80);
sink.writeln('日志导出时间: ${DateTime.now()}');
sink.writeln('日志文件数量: ${logFiles.length}');
sink.writeln('=' * 80);
sink.writeln();
// 合并所有日志文件
for (var i = 0; i < logFiles.length; i++) {
final logFile = logFiles[i];
sink.writeln('-' * 80);
sink.writeln('文件 ${i + 1}: ${logFile.path.split('/').last}');
sink.writeln('修改时间: ${logFile.lastModifiedSync()}');
sink.writeln('-' * 80);
final content = await logFile.readAsString();
sink.writeln(content);
sink.writeln();
}
await sink.flush();
await sink.close();
debugPrint('[DKLog] 日志已导出到: ${exportFile.path}');
return exportFile.path;
} catch (e, stackTrace) {
debugPrint('[DKLog] 导出日志失败: $e');
debugPrint('[DKLog] StackTrace: $stackTrace');
return null;
}
}