exportLogs static method

Future<String?> exportLogs({
  1. String? destinationPath,
})

导出日志文件到公共目录(需要存储权限)

@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;
  }
}