writer.Gorm.go 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. package logx
  2. import (
  3. "io"
  4. "os"
  5. "git.ooo.ink/root/go-kit/src/logx/tool"
  6. "github.com/rs/zerolog"
  7. "gorm.io/gorm/logger"
  8. )
  9. // 单例
  10. var (
  11. gormWriter logger.Writer
  12. )
  13. // InitGormWriter 初始化 GORM 框架专用的日志写入器
  14. //
  15. // 该函数创建一个专门用于 GORM 数据库操作日志的日志器实例,配置了适合 SQL 查询日志的格式。
  16. // GORM 日志器会记录数据库操作的详细信息,包括 SQL 语句、执行时间等,便于数据库性能监控和调试。
  17. //
  18. // 参数:
  19. //
  20. // writer - GORM 日志输出目标,通常是文件写入器或控制台
  21. //
  22. // 功能特性:
  23. // - 专门为 GORM 框架优化的日志格式
  24. // - 使用控制台格式输出,便于阅读 SQL 查询和执行信息
  25. // - 禁用颜色输出,适合文件持久化存储
  26. // - 包含时间戳信息,便于数据库操作的时间追踪
  27. // - 实现单例模式,全局共享 GORM 日志器
  28. //
  29. // 使用示例:
  30. //
  31. // // 创建 GORM 日志文件写入器(推荐启用异步写入)
  32. // gormWriter := logx.DefaultWriter("gorm.log", true)
  33. //
  34. // // 初始化 GORM 日志器
  35. // logx.InitGormWriter(gormWriter)
  36. //
  37. // // 配置 GORM 使用自定义日志器
  38. // db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
  39. // Logger: logx.GormLogger(logger.Config{
  40. // SlowThreshold: 200 * time.Millisecond,
  41. // LogLevel: logger.Warn,
  42. // }),
  43. // })
  44. //
  45. // 注意事项:
  46. // - GORM 日志可能包含敏感信息(如 SQL 参数),生产环境中需谨慎处理
  47. // - 建议启用异步写入以提高数据库操作性能
  48. // - 需要先调用 logx.InitDefault() 或设置 loggingLocationName 以确保时区正确
  49. // - 与标准日志不同,GORM 日志器不包含调用者信息,避免日志过于冗长
  50. func InitGormWriter(writer io.Writer) {
  51. // 创建配置完善的 zerolog GORM 日志器:
  52. // - ConsoleWriter: 使用控制台格式,便于阅读 SQL 查询和执行信息
  53. // - Out: writer: 指定 GORM 日志的输出目标
  54. // - NoColor: true: 禁用颜色输出,适合文件记录
  55. // - FormatTimestamp: 使用自定义时区格式化数据库操作时间
  56. // - With().Timestamp(): 自动记录数据库操作的时间戳
  57. // 注意:GORM 日志器不包含调用者信息,避免 SQL 日志过于冗长
  58. l := zerolog.New(zerolog.ConsoleWriter{
  59. Out: writer, // GORM 日志输出目标
  60. NoColor: true, // 禁用颜色(适合文件记录)
  61. FormatTimestamp: tool.ZerologFormatTimestamp(loggingLocationName), // 自定义时区时间戳
  62. }).With().Timestamp().Logger() // 仅包含时间戳,不包含调用者信息
  63. // 存储单例实例,供全局 GORM 日志记录使用
  64. // 后续调用 logx.GormLogger() 时会使用这个预配置的日志器
  65. gormWriter = &l
  66. }
  67. // GormLogger 根据配置创建并返回 GORM 框架的日志器接口
  68. //
  69. // 该函数实现了智能的 GORM 日志器选择机制:
  70. // 1. 如果已经通过 InitGormWriter() 初始化了专用 GORM 日志器,则基于该日志器创建 GORM 日志器
  71. // 2. 如果没有初始化,则创建一个临时的控制台输出日志器作为回退方案
  72. //
  73. // 参数:
  74. //
  75. // config - GORM 日志配置,包含慢查询阈值、日志级别等参数
  76. //
  77. // 返回值:
  78. //
  79. // logger.Interface - 符合 GORM 框架要求的日志器接口
  80. //
  81. // 主要用途:
  82. // 1. 配置 GORM 数据库连接使用自定义日志器
  83. // 2. 控制 GORM 的日志输出级别和格式
  84. // 3. 监控数据库操作的性能和错误
  85. //
  86. // 使用示例:
  87. //
  88. // db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
  89. // Logger: logx.GormLogger(logger.Config{
  90. // SlowThreshold: 200 * time.Millisecond, // 慢查询阈值
  91. // IgnoreRecordNotFoundError: false, // 是否忽略记录未找到错误
  92. // ParameterizedQueries: false, // 是否参数化查询
  93. // LogLevel: logger.Warn, // 日志级别
  94. // }),
  95. // })
  96. //
  97. // 配置参数说明:
  98. // - SlowThreshold: 慢查询阈值,超过该时间的查询会被记录为慢查询
  99. // - IgnoreRecordNotFoundError: 是否忽略 "记录未找到" 错误
  100. // - ParameterizedQueries: 是否在日志中显示参数化查询的具体参数
  101. // - LogLevel: 日志级别(Silent、Error、Warn、Info)
  102. //
  103. // 智能配置特性:
  104. // - 专用日志器模式: 禁用颜色输出(Colorful = false),适合文件记录
  105. // - 回退控制台模式: 启用颜色输出(Colorful = true),便于控制台调试
  106. // - 自动适配: 根据是否初始化专用日志器自动调整颜色配置
  107. //
  108. // 最佳实践:
  109. // - 生产环境建议使用专用文件日志器,并设置适当的日志级别
  110. // - 开发环境可以使用回退的控制台日志器进行 SQL 调试
  111. // - 根据应用需求调整慢查询阈值和日志级别
  112. func GormLogger(config logger.Config) logger.Interface {
  113. // 检查是否已经初始化了专用 GORM 日志器
  114. // 如果已初始化,则基于预配置的日志器创建 GORM 日志器
  115. if gormWriter != nil {
  116. // 专用日志器模式下禁用颜色输出,适合文件记录
  117. config.Colorful = false
  118. // 创建符合 GORM 接口的日志器
  119. return logger.New(gormWriter, config)
  120. }
  121. // 如果没有初始化专用 GORM 日志器,创建临时控制台日志器作为回退
  122. // 控制台输出适合开发环境调试使用,启用颜色便于识别 SQL 查询类型
  123. l := zerolog.New(zerolog.ConsoleWriter{
  124. Out: os.Stdout, // 输出到标准输出
  125. NoColor: false, // 启用颜色输出(便于控制台识别)
  126. FormatTimestamp: tool.ZerologFormatTimestamp(loggingLocationName), // 自定义时区时间戳
  127. }).With().Timestamp().Logger() // 包含时间戳信息
  128. // 回退模式下启用颜色输出,便于在控制台中区分不同类型的 SQL 日志
  129. config.Colorful = true
  130. // 创建符合 GORM 接口的日志器,使用临时控制台日志器
  131. return logger.New(&l, config)
  132. }