Error.go 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  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. )
  8. // 单例
  9. var (
  10. errorLogger *zerolog.Logger
  11. )
  12. // InitErrorWriter 初始化 Error 级别的日志写入器
  13. //
  14. // 该函数创建一个专门用于处理错误级别日志的 zerolog 日志器实例。
  15. // Error 日志器会自动包含错误堆栈信息,便于调试和问题追踪。
  16. //
  17. // 参数:
  18. //
  19. // writer - 错误日志输出目标,通常是文件写入器或控制台
  20. //
  21. // 功能特性:
  22. // - 自动包含完整的错误堆栈信息(通过 zerolog.ErrorStackMarshaler 配置)
  23. // - 使用控制台格式输出,便于阅读和分析
  24. // - 禁用颜色输出,适合文件持久化存储
  25. // - 包含时间戳和调用者信息,便于问题定位
  26. // - 实现单例模式,全局共享错误日志器
  27. //
  28. // 使用示例:
  29. //
  30. // // 创建错误日志文件写入器(推荐启用异步写入)
  31. // errorWriter := logx.DefaultWriter("error.log", true)
  32. //
  33. // // 初始化 Error 日志器
  34. // logx.InitErrorWriter(errorWriter)
  35. //
  36. // 注意事项:
  37. // - 错误日志通常需要单独的文件存储,便于监控和告警
  38. // - 建议在生产环境中始终启用 Error 日志记录
  39. // - 错误堆栈信息需要在全局初始化时配置(参见 logx.InitDefault)
  40. func InitErrorWriter(writer io.Writer) {
  41. // 创建配置完善的 zerolog 错误日志器:
  42. // - ConsoleWriter: 使用控制台格式,便于人类阅读错误信息
  43. // - Out: writer: 指定错误日志的输出目标
  44. // - NoColor: true: 禁用颜色输出,适合文件记录
  45. // - FormatTimestamp: 使用自定义时区格式化错误发生时间
  46. // - With().Timestamp(): 自动记录错误发生的时间戳
  47. // - With().Caller(): 包含错误发生的调用位置信息
  48. l := zerolog.New(zerolog.ConsoleWriter{
  49. Out: writer, // 错误日志输出目标
  50. NoColor: true, // 禁用颜色(适合文件记录)
  51. FormatTimestamp: tool.ZerologFormatTimestamp(loggingLocationName), // 自定义时区时间戳
  52. }).With().Timestamp().Caller().Logger()
  53. // 存储单例实例,供全局错误记录使用
  54. // 后续调用 logx.Error() 时会使用这个预配置的错误日志器
  55. errorLogger = &l
  56. }
  57. // Error 返回一个 Error 级别的日志事件,用于记录错误信息
  58. //
  59. // 该函数实现了智能的错误日志器选择机制:
  60. // 1. 如果已经通过 InitErrorWriter() 初始化了专用错误日志器,则使用该日志器
  61. // 2. 如果没有初始化,则创建一个临时的控制台输出日志器作为回退方案
  62. //
  63. // 返回值:
  64. //
  65. // *zerolog.Event - 可用于链式调用的错误日志事件对象
  66. //
  67. // 使用方式:
  68. // 1. 直接记录错误消息: logx.Error().Msg("错误描述")
  69. // 2. 关联错误对象: logx.Error().Err(err).Msg("操作失败")
  70. // 3. 添加错误上下文: logx.Error().Str("module", "auth").Int("code", 500).Send()
  71. //
  72. // 使用示例:
  73. //
  74. // // 简单错误消息记录
  75. // logx.Error().Msg("数据库连接失败")
  76. //
  77. // // 关联具体的错误对象
  78. // err := errors.New("权限验证失败")
  79. // logx.Error().Err(err).Msg("用户登录失败")
  80. //
  81. // // 添加上下文信息
  82. // logx.Error().
  83. // Str("endpoint", "/api/login").
  84. // Int("status", 401).
  85. // Any("request", req).
  86. // Msg("认证失败")
  87. //
  88. // 最佳实践:
  89. // - 始终记录具体的错误对象(使用 .Err() 方法)
  90. // - 提供足够的上下文信息便于问题定位
  91. // - 生产环境中错误日志应该单独存储和监控
  92. // - 使用结构化字段而不是字符串拼接
  93. func Error() *zerolog.Event {
  94. // 检查是否已经初始化了专用错误日志器
  95. // 如果已初始化,则使用预配置的错误日志器(通常指向单独的错误日志文件)
  96. if errorLogger != nil {
  97. return errorLogger.Error()
  98. }
  99. // 如果没有初始化专用错误日志器,创建临时控制台日志器作为回退
  100. // 这种设计确保即使没有显式初始化,错误日志也能正常工作
  101. // 控制台输出适合开发环境调试使用,启用颜色便于识别
  102. l := zerolog.New(zerolog.ConsoleWriter{
  103. Out: os.Stdout, // 输出到标准输出
  104. NoColor: false, // 启用颜色输出(便于控制台识别错误)
  105. FormatTimestamp: tool.ZerologFormatTimestamp(loggingLocationName), // 自定义时区时间戳
  106. }).With().Timestamp().Caller().Logger() // 包含时间戳和调用者信息
  107. // 返回 Error 级别的日志事件,可以继续链式调用添加错误信息和上下文
  108. return l.Error()
  109. }