logger.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. package logger
  2. import (
  3. "context"
  4. "errors"
  5. "github.com/gogf/gf/v2/frame/g"
  6. "github.com/gogf/gf/v2/os/glog"
  7. )
  8. // 定义键名
  9. const (
  10. TraceIDKey = "trace_id"
  11. UserIDKey = "user_id"
  12. SpanTitleKey = "span_title"
  13. SpanFunctionKey = "span_function"
  14. VersionKey = "version"
  15. )
  16. var log *glog.Logger
  17. // TraceIDFunc 定义获取跟踪ID的函数
  18. type TraceIDFunc func() string
  19. var (
  20. version string
  21. traceIDFunc TraceIDFunc
  22. )
  23. // SetTraceIdFunc 设置获取追踪Id的生成函数
  24. func SetTraceIdFunc(fn TraceIDFunc) {
  25. traceIDFunc = fn
  26. }
  27. // SetVersion 设置版本号
  28. func SetVersion(ver string) {
  29. version = ver
  30. }
  31. // FromTraceIDContext 从上下文中获取跟踪ID
  32. func FromTraceIDContext(ctx context.Context) string {
  33. v := ctx.Value(TraceIDKey)
  34. if v != nil {
  35. if s, ok := v.(string); ok {
  36. return s
  37. }
  38. }
  39. return getTraceID()
  40. }
  41. // NewUserIDContext 创建用户ID上下文
  42. func NewUserIDContext(ctx context.Context, userID string) context.Context {
  43. return context.WithValue(ctx, UserIDKey, userID)
  44. }
  45. // FromUserIDContext 从上下文中获取用户ID
  46. func FromUserIDContext(ctx context.Context) string {
  47. v := ctx.Value(UserIDKey)
  48. if v != nil {
  49. if s, ok := v.(string); ok {
  50. return s
  51. }
  52. }
  53. return ""
  54. }
  55. func getTraceID() string {
  56. if traceIDFunc != nil {
  57. return traceIDFunc()
  58. }
  59. return ""
  60. }
  61. // GetLogger 获取logger
  62. func GetLogger() *glog.Logger {
  63. return log
  64. }
  65. // NewTraceIDContext 创建跟踪ID上下文
  66. func NewTraceIDContext(ctx context.Context, traceID string) context.Context {
  67. return context.WithValue(ctx, TraceIDKey, traceID)
  68. }
  69. // Init 初始化日志配置
  70. func Init(runMode string) {
  71. if log != nil {
  72. panic(errors.New("重复初始化logger"))
  73. }
  74. log = g.Log()
  75. var lv string
  76. switch runMode {
  77. case "debug":
  78. lv = "DEV"
  79. break
  80. case "test":
  81. lv = "DEV"
  82. break
  83. case "release":
  84. lv = "PRODUCT"
  85. break
  86. }
  87. err := log.SetLevelStr(lv)
  88. if err != nil {
  89. panic(err)
  90. }
  91. }
  92. type spanOptions struct {
  93. Title string
  94. FuncName string
  95. }
  96. // SpanOption 定义跟踪单元的数据项
  97. type SpanOption func(*spanOptions)
  98. // SetSpanTitle 设置跟踪单元的标题
  99. func SetSpanTitle(title string) SpanOption {
  100. return func(o *spanOptions) {
  101. o.Title = title
  102. }
  103. }
  104. // SetSpanFuncName 设置跟踪单元的函数名
  105. func SetSpanFuncName(funcName string) SpanOption {
  106. return func(o *spanOptions) {
  107. o.FuncName = funcName
  108. }
  109. }
  110. // StartSpan 开始一个追踪单元
  111. func StartSpan(ctx context.Context, opts ...SpanOption) *Entry {
  112. if ctx == nil {
  113. ctx = context.Background()
  114. }
  115. var o spanOptions
  116. for _, opt := range opts {
  117. opt(&o)
  118. }
  119. return NewEntry(log)
  120. }
  121. // Entry 定义统一的日志写入方式
  122. type Entry struct {
  123. entry *glog.Logger
  124. }
  125. func NewEntry(entry *glog.Logger) *Entry {
  126. return &Entry{entry: entry}
  127. }
  128. // Debugf 写入调试日志
  129. func Debugf(ctx context.Context, format string, args ...interface{}) {
  130. StartSpan(ctx).entry.Debugf(ctx, format, args)
  131. }
  132. // Printf 写入消息日志
  133. func Printf(ctx context.Context, format string, args ...interface{}) {
  134. StartSpan(ctx).entry.Printf(ctx, format, args...)
  135. }
  136. // Warnf 写入警告日志
  137. func Warnf(ctx context.Context, format string, args ...interface{}) {
  138. StartSpan(ctx).entry.Warningf(ctx, format, args...)
  139. }
  140. // Fatalf 写入重大错误日志
  141. func Fatalf(ctx context.Context, format string, args ...interface{}) {
  142. StartSpan(ctx).entry.Fatalf(ctx, format, args...)
  143. }
  144. // Errorf 错误日志
  145. func Errorf(ctx context.Context, format string, args ...interface{}) {
  146. StartSpan(ctx).entry.Errorf(ctx, format, args...)
  147. }
  148. // Errorf 错误日志
  149. func (e *Entry) Errorf(ctx context.Context, format string, args ...interface{}) {
  150. e.entry.Errorf(ctx, format, args...)
  151. }
  152. // Warnf 警告日志
  153. func (e *Entry) Warnf(ctx context.Context, format string, args ...interface{}) {
  154. e.entry.Warningf(ctx, format, args...)
  155. }
  156. // Infof 消息日志
  157. func (e *Entry) Infof(ctx context.Context, format string, args ...interface{}) {
  158. e.entry.Infof(ctx, format, args...)
  159. }
  160. // Printf 消息日志
  161. func (e *Entry) Printf(ctx context.Context, format string, args ...interface{}) {
  162. e.entry.Printf(ctx, format, args...)
  163. }
  164. // Debugf 写入调试日志
  165. func (e *Entry) Debugf(ctx context.Context, format string, args ...interface{}) {
  166. e.entry.Debugf(ctx, format, args...)
  167. }