logs.go 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. package services
  2. import (
  3. "bytes"
  4. "fmt"
  5. "io/ioutil"
  6. "log"
  7. "xg_fetl/internal/models"
  8. )
  9. // 将总览信息和按表分类的详细日志写入日志文件
  10. func WriteExportReportToLogFile(logFilePath string, resultsMap map[string]TableResult, tableInfos map[string]models.TableInfo) error {
  11. var logBuffer bytes.Buffer
  12. // 构建总览信息
  13. logBuffer.WriteString("========== 导出结果总览 ==========\n")
  14. var successTables []string
  15. var failedTables []TableResult
  16. for _, result := range resultsMap {
  17. if result.Success {
  18. successTables = append(successTables, result.TableName)
  19. } else {
  20. failedTables = append(failedTables, result)
  21. }
  22. }
  23. logBuffer.WriteString(fmt.Sprintf("成功导出的表(%d 个):\n", len(successTables)))
  24. for _, tableName := range successTables {
  25. result := resultsMap[tableName]
  26. avgRowSizeKB := float64(result.AverageRowSize) / 1024.0
  27. tableSizeMB := float64(result.TableSize) / (1024.0 * 1024.0)
  28. exportTime := result.ExportDuration.Seconds()
  29. estimatedTime := result.EstimatedDuration.Seconds()
  30. logBuffer.WriteString(fmt.Sprintf("- %s\n", tableName))
  31. logBuffer.WriteString(fmt.Sprintf(" 总行数:%d\n", result.TotalRows))
  32. logBuffer.WriteString(fmt.Sprintf(" 平均行大小:%.2f KB\n", avgRowSizeKB))
  33. logBuffer.WriteString(fmt.Sprintf(" 表的容量:%.2f MB\n", tableSizeMB))
  34. logBuffer.WriteString(fmt.Sprintf(" 估算导出耗时:%.2f 秒\n", estimatedTime))
  35. logBuffer.WriteString(fmt.Sprintf(" 实际导出耗时:%.2f 秒\n", exportTime))
  36. logBuffer.WriteString(fmt.Sprintf(" 总错误次数:%d\n", result.ErrorCount))
  37. logBuffer.WriteString(fmt.Sprintf(" 使用协程数:%d\n", result.GoroutineCount))
  38. }
  39. logBuffer.WriteString("\n")
  40. if len(failedTables) > 0 {
  41. logBuffer.WriteString(fmt.Sprintf("导出失败的表(%d 个):\n", len(failedTables)))
  42. for _, failedTable := range failedTables {
  43. logBuffer.WriteString(fmt.Sprintf("- %s\n", failedTable.TableName))
  44. logBuffer.WriteString(fmt.Sprintf(" 错误次数:%d\n", failedTable.ErrorCount))
  45. logBuffer.WriteString(fmt.Sprintf(" 使用协程数:%d\n", failedTable.GoroutineCount))
  46. logBuffer.WriteString(fmt.Sprintf(" 错误信息:%v\n", failedTable.Error))
  47. }
  48. } else {
  49. logBuffer.WriteString("所有表均导出成功。\n")
  50. }
  51. logBuffer.WriteString("\n")
  52. logBuffer.WriteString("========== 详细日志信息 ==========\n")
  53. // 按表名排序,输出每个表的详细日志信息
  54. for _, tableName := range sortedTableNames(tableInfos) {
  55. logBuffer.WriteString(fmt.Sprintf("------------ 表 %s ------------\n", tableName))
  56. result, exists := resultsMap[tableName]
  57. if exists {
  58. for _, msg := range result.Logs {
  59. logBuffer.WriteString(msg)
  60. }
  61. logBuffer.WriteString("\n")
  62. } else {
  63. logBuffer.WriteString(fmt.Sprintf("表 %s 的处理结果不存在。\n", tableName))
  64. }
  65. }
  66. // 将新的日志内容写回日志文件
  67. err := ioutil.WriteFile(logFilePath, logBuffer.Bytes(), 0644)
  68. if err != nil {
  69. return fmt.Errorf("无法写入日志文件: %v", err)
  70. }
  71. return nil
  72. }
  73. // WriteImportReportToLogFile 函数将总览信息和按表分类的详细日志写入日志文件
  74. func WriteImportReportToLogFile(logFilePath string, resultsMap map[string]TableResult, tableInfos map[string]models.TableInfo) error {
  75. var logBuffer bytes.Buffer
  76. // 构建总览信息
  77. logBuffer.WriteString("========== 导入结果总览 ==========\n")
  78. var successTables []string
  79. var failedTables []TableResult
  80. for _, result := range resultsMap {
  81. if result.Success {
  82. successTables = append(successTables, result.TableName)
  83. } else {
  84. failedTables = append(failedTables, result)
  85. }
  86. }
  87. logBuffer.WriteString(fmt.Sprintf("成功导入的表(%d 个):\n", len(successTables)))
  88. for _, tableName := range successTables {
  89. result := resultsMap[tableName]
  90. avgRowSizeKB := float64(result.AverageRowSize) / 1024.0
  91. tableSizeMB := float64(result.TableSize) / (1024.0 * 1024.0)
  92. exportTime := result.ExportDuration.Seconds()
  93. estimatedTime := result.EstimatedDuration.Seconds()
  94. logBuffer.WriteString(fmt.Sprintf("- %s\n", tableName))
  95. logBuffer.WriteString(fmt.Sprintf(" 总行数:%d\n", result.TotalRows))
  96. logBuffer.WriteString(fmt.Sprintf(" 平均行大小:%.2f KB\n", avgRowSizeKB))
  97. logBuffer.WriteString(fmt.Sprintf(" 表的容量:%.2f MB\n", tableSizeMB))
  98. logBuffer.WriteString(fmt.Sprintf(" 估算导入耗时:%.2f 秒\n", estimatedTime))
  99. logBuffer.WriteString(fmt.Sprintf(" 实际导入耗时:%.2f 秒\n", exportTime))
  100. logBuffer.WriteString(fmt.Sprintf(" 总错误次数:%d\n", result.ErrorCount))
  101. logBuffer.WriteString(fmt.Sprintf(" 使用协程数:%d\n", result.GoroutineCount))
  102. }
  103. logBuffer.WriteString("\n")
  104. if len(failedTables) > 0 {
  105. logBuffer.WriteString(fmt.Sprintf("导入失败的表(%d 个):\n", len(failedTables)))
  106. for _, failedTable := range failedTables {
  107. logBuffer.WriteString(fmt.Sprintf("- %s\n", failedTable.TableName))
  108. logBuffer.WriteString(fmt.Sprintf(" 错误次数:%d\n", failedTable.ErrorCount))
  109. logBuffer.WriteString(fmt.Sprintf(" 使用协程数:%d\n", failedTable.GoroutineCount))
  110. logBuffer.WriteString(fmt.Sprintf(" 错误信息:%v\n", failedTable.Error))
  111. }
  112. } else {
  113. logBuffer.WriteString("所有表均导入成功。\n")
  114. }
  115. logBuffer.WriteString("\n")
  116. logBuffer.WriteString("========== 详细日志信息 ==========\n")
  117. // 按表名排序,输出每个表的详细日志信息
  118. for _, tableName := range sortedTableNames(tableInfos) {
  119. logBuffer.WriteString(fmt.Sprintf("------------ 表 %s ------------\n", tableName))
  120. result, exists := resultsMap[tableName]
  121. if exists {
  122. for _, msg := range result.Logs {
  123. logBuffer.WriteString(msg)
  124. }
  125. logBuffer.WriteString("\n")
  126. } else {
  127. logBuffer.WriteString(fmt.Sprintf("表 %s 的处理结果不存在。\n", tableName))
  128. }
  129. }
  130. // 将新的日志内容写回日志文件
  131. err := ioutil.WriteFile(logFilePath, logBuffer.Bytes(), 0644)
  132. if err != nil {
  133. return fmt.Errorf("无法写入日志文件: %v", err)
  134. }
  135. return nil
  136. }
  137. // 日志消息记录函数
  138. func logMessage(result *TableResult, msg string, logger *log.Logger) {
  139. fmt.Print(msg)
  140. logger.Print(msg)
  141. result.Logs = append(result.Logs, msg)
  142. }