package services import ( "bytes" "fmt" "io/ioutil" "log" "xg_fetl/internal/models" ) // 将总览信息和按表分类的详细日志写入日志文件 func WriteExportReportToLogFile(logFilePath string, resultsMap map[string]TableResult, tableInfos map[string]models.TableInfo) error { var logBuffer bytes.Buffer // 构建总览信息 logBuffer.WriteString("========== 导出结果总览 ==========\n") var successTables []string var failedTables []TableResult for _, result := range resultsMap { if result.Success { successTables = append(successTables, result.TableName) } else { failedTables = append(failedTables, result) } } logBuffer.WriteString(fmt.Sprintf("成功导出的表(%d 个):\n", len(successTables))) for _, tableName := range successTables { result := resultsMap[tableName] avgRowSizeKB := float64(result.AverageRowSize) / 1024.0 tableSizeMB := float64(result.TableSize) / (1024.0 * 1024.0) exportTime := result.ExportDuration.Seconds() estimatedTime := result.EstimatedDuration.Seconds() logBuffer.WriteString(fmt.Sprintf("- %s\n", tableName)) logBuffer.WriteString(fmt.Sprintf(" 总行数:%d\n", result.TotalRows)) logBuffer.WriteString(fmt.Sprintf(" 平均行大小:%.2f KB\n", avgRowSizeKB)) logBuffer.WriteString(fmt.Sprintf(" 表的容量:%.2f MB\n", tableSizeMB)) logBuffer.WriteString(fmt.Sprintf(" 估算导出耗时:%.2f 秒\n", estimatedTime)) logBuffer.WriteString(fmt.Sprintf(" 实际导出耗时:%.2f 秒\n", exportTime)) logBuffer.WriteString(fmt.Sprintf(" 总错误次数:%d\n", result.ErrorCount)) logBuffer.WriteString(fmt.Sprintf(" 使用协程数:%d\n", result.GoroutineCount)) } logBuffer.WriteString("\n") if len(failedTables) > 0 { logBuffer.WriteString(fmt.Sprintf("导出失败的表(%d 个):\n", len(failedTables))) for _, failedTable := range failedTables { logBuffer.WriteString(fmt.Sprintf("- %s\n", failedTable.TableName)) logBuffer.WriteString(fmt.Sprintf(" 错误次数:%d\n", failedTable.ErrorCount)) logBuffer.WriteString(fmt.Sprintf(" 使用协程数:%d\n", failedTable.GoroutineCount)) logBuffer.WriteString(fmt.Sprintf(" 错误信息:%v\n", failedTable.Error)) } } else { logBuffer.WriteString("所有表均导出成功。\n") } logBuffer.WriteString("\n") logBuffer.WriteString("========== 详细日志信息 ==========\n") // 按表名排序,输出每个表的详细日志信息 for _, tableName := range sortedTableNames(tableInfos) { logBuffer.WriteString(fmt.Sprintf("------------ 表 %s ------------\n", tableName)) result, exists := resultsMap[tableName] if exists { for _, msg := range result.Logs { logBuffer.WriteString(msg) } logBuffer.WriteString("\n") } else { logBuffer.WriteString(fmt.Sprintf("表 %s 的处理结果不存在。\n", tableName)) } } // 将新的日志内容写回日志文件 err := ioutil.WriteFile(logFilePath, logBuffer.Bytes(), 0644) if err != nil { return fmt.Errorf("无法写入日志文件: %v", err) } return nil } // WriteImportReportToLogFile 函数将总览信息和按表分类的详细日志写入日志文件 func WriteImportReportToLogFile(logFilePath string, resultsMap map[string]TableResult, tableInfos map[string]models.TableInfo) error { var logBuffer bytes.Buffer // 构建总览信息 logBuffer.WriteString("========== 导入结果总览 ==========\n") var successTables []string var failedTables []TableResult for _, result := range resultsMap { if result.Success { successTables = append(successTables, result.TableName) } else { failedTables = append(failedTables, result) } } logBuffer.WriteString(fmt.Sprintf("成功导入的表(%d 个):\n", len(successTables))) for _, tableName := range successTables { result := resultsMap[tableName] avgRowSizeKB := float64(result.AverageRowSize) / 1024.0 tableSizeMB := float64(result.TableSize) / (1024.0 * 1024.0) exportTime := result.ExportDuration.Seconds() estimatedTime := result.EstimatedDuration.Seconds() logBuffer.WriteString(fmt.Sprintf("- %s\n", tableName)) logBuffer.WriteString(fmt.Sprintf(" 总行数:%d\n", result.TotalRows)) logBuffer.WriteString(fmt.Sprintf(" 平均行大小:%.2f KB\n", avgRowSizeKB)) logBuffer.WriteString(fmt.Sprintf(" 表的容量:%.2f MB\n", tableSizeMB)) logBuffer.WriteString(fmt.Sprintf(" 估算导入耗时:%.2f 秒\n", estimatedTime)) logBuffer.WriteString(fmt.Sprintf(" 实际导入耗时:%.2f 秒\n", exportTime)) logBuffer.WriteString(fmt.Sprintf(" 总错误次数:%d\n", result.ErrorCount)) logBuffer.WriteString(fmt.Sprintf(" 使用协程数:%d\n", result.GoroutineCount)) } logBuffer.WriteString("\n") if len(failedTables) > 0 { logBuffer.WriteString(fmt.Sprintf("导入失败的表(%d 个):\n", len(failedTables))) for _, failedTable := range failedTables { logBuffer.WriteString(fmt.Sprintf("- %s\n", failedTable.TableName)) logBuffer.WriteString(fmt.Sprintf(" 错误次数:%d\n", failedTable.ErrorCount)) logBuffer.WriteString(fmt.Sprintf(" 使用协程数:%d\n", failedTable.GoroutineCount)) logBuffer.WriteString(fmt.Sprintf(" 错误信息:%v\n", failedTable.Error)) } } else { logBuffer.WriteString("所有表均导入成功。\n") } logBuffer.WriteString("\n") logBuffer.WriteString("========== 详细日志信息 ==========\n") // 按表名排序,输出每个表的详细日志信息 for _, tableName := range sortedTableNames(tableInfos) { logBuffer.WriteString(fmt.Sprintf("------------ 表 %s ------------\n", tableName)) result, exists := resultsMap[tableName] if exists { for _, msg := range result.Logs { logBuffer.WriteString(msg) } logBuffer.WriteString("\n") } else { logBuffer.WriteString(fmt.Sprintf("表 %s 的处理结果不存在。\n", tableName)) } } // 将新的日志内容写回日志文件 err := ioutil.WriteFile(logFilePath, logBuffer.Bytes(), 0644) if err != nil { return fmt.Errorf("无法写入日志文件: %v", err) } return nil } // 日志消息记录函数 func logMessage(result *TableResult, msg string, logger *log.Logger) { fmt.Print(msg) logger.Print(msg) result.Logs = append(result.Logs, msg) }