123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154 |
- 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)
- }
|