Info.go 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  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. infoLogger *zerolog.Logger
  11. )
  12. // InitInfoWriter 初始化 Info 级别的日志写入器
  13. //
  14. // 该函数创建一个专门用于处理信息级别日志的 zerolog 日志器实例。
  15. // Info 日志器用于记录应用程序的正常运行状态、业务操作信息等常规日志。
  16. //
  17. // 参数:
  18. //
  19. // writer - 信息日志输出目标,可以是文件、控制台或其他实现了 io.Writer 接口的对象
  20. //
  21. // 功能特性:
  22. // - 使用控制台格式输出,便于人类阅读和分析
  23. // - 禁用颜色输出(NoColor: true),适合文件持久化存储
  24. // - 自动包含时间戳,使用配置的时区格式化
  25. // - 包含调用者信息(文件名和行号),便于问题定位
  26. // - 实现单例模式,全局共享同一个日志器实例
  27. //
  28. // 使用示例:
  29. //
  30. // // 使用默认配置创建异步文件写入器
  31. // writer := logx.DefaultWriter("info.log", true)
  32. //
  33. // // 初始化 Info 日志器
  34. // logx.InitInfoWriter(writer)
  35. //
  36. // 注意事项:
  37. // - 该函数应该在应用程序启动时调用一次
  38. // - 如果多次调用,后一次的配置会覆盖前一次
  39. // - 需要先调用 logx.InitDefault() 或设置 loggingLocationName 以确保时区正确
  40. // - Info 日志通常包含业务操作信息,建议单独存储便于分析
  41. func InitInfoWriter(writer io.Writer) {
  42. // 创建配置完善的 zerolog 信息日志器:
  43. // - ConsoleWriter: 使用控制台格式输出,便于阅读业务操作信息
  44. // - Out: writer: 指定信息日志的输出目标
  45. // - NoColor: true: 禁用颜色输出,适合文件记录
  46. // - FormatTimestamp: 使用自定义时区格式化时间戳
  47. // - With().Timestamp(): 自动包含时间戳字段
  48. // - With().Caller(): 自动包含调用者信息(文件名和行号)
  49. l := zerolog.New(zerolog.ConsoleWriter{
  50. Out: writer, // 信息日志输出目标
  51. NoColor: true, // 禁用颜色(适合文件记录)
  52. FormatTimestamp: tool.ZerologFormatTimestamp(loggingLocationName), // 自定义时区时间戳
  53. }).With().Timestamp().Caller().Logger()
  54. // 存储单例实例,供全局信息日志记录使用
  55. // 后续调用 logx.Info() 时会使用这个预配置的日志器
  56. infoLogger = &l
  57. }
  58. // Info 返回一个 Info 级别的日志事件,用于记录常规信息
  59. //
  60. // 该函数实现了智能的日志器选择机制:
  61. // 1. 如果已经通过 InitInfoWriter() 初始化了专用信息日志器,则使用该日志器
  62. // 2. 如果没有初始化,则创建一个临时的控制台输出日志器作为回退方案
  63. //
  64. // 返回值:
  65. //
  66. // *zerolog.Event - 可用于链式调用的信息日志事件对象
  67. //
  68. // 使用方式:
  69. // 1. 直接记录消息: logx.Info().Msg("业务操作完成")
  70. // 2. 添加结构化字段: logx.Info().Str("user", "john").Int("count", 10).Send()
  71. // 3. 记录业务数据: logx.Info().Any("order", orderData).Send()
  72. //
  73. // 使用示例:
  74. //
  75. // // 简单信息记录
  76. // logx.Info().Msg("用户登录成功")
  77. //
  78. // // 带结构化字段的记录
  79. // logx.Info().
  80. // Str("username", "john").
  81. // Int("loginCount", 5).
  82. // Msg("用户登录统计")
  83. //
  84. // // 记录业务数据
  85. // logx.Info().
  86. // Any("request", req).
  87. // Any("response", resp).
  88. // Send()
  89. //
  90. // 最佳实践:
  91. // - 使用 Info 日志记录应用程序的正常运行状态和业务操作
  92. // - 生产环境中 Info 日志应该单独存储,便于业务分析
  93. // - 使用结构化字段而不是字符串拼接,便于日志分析和查询
  94. // - 避免在 Info 日志中记录敏感信息
  95. func Info() *zerolog.Event {
  96. // 检查是否已经初始化了专用信息日志器
  97. // 如果已初始化,则使用预配置的日志器(通常指向文件或其他持久化存储)
  98. if infoLogger != nil {
  99. return infoLogger.Info()
  100. }
  101. // 如果没有初始化专用日志器,创建临时控制台日志器作为回退
  102. // 这种设计确保即使没有显式初始化,Info 日志也能正常工作
  103. // 控制台输出适合开发环境调试使用,启用颜色便于识别
  104. l := zerolog.New(zerolog.ConsoleWriter{
  105. Out: os.Stdout, // 输出到标准输出
  106. NoColor: false, // 启用颜色输出(便于控制台识别)
  107. FormatTimestamp: tool.ZerologFormatTimestamp(loggingLocationName), // 自定义时区时间戳
  108. }).With().Timestamp().Caller().Logger() // 包含时间戳和调用者信息
  109. // 返回 Info 级别的日志事件,可以继续链式调用添加字段和消息
  110. return l.Info()
  111. }