zap.go 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. package zap
  2. import (
  3. "IotAdmin/core/logger"
  4. "context"
  5. "fmt"
  6. "io"
  7. "os"
  8. "sync"
  9. "go.uber.org/zap"
  10. "go.uber.org/zap/zapcore"
  11. )
  12. type zapLogger struct {
  13. cfg zap.Config
  14. zap *zap.Logger
  15. opts logger.Options
  16. sync.RWMutex
  17. fields map[string]interface{}
  18. }
  19. // NewLogger 构建新的记录器
  20. func NewLogger(opts ...logger.Option) (logger.Logger, error) {
  21. // Default options
  22. options := logger.Options{
  23. Level: logger.InfoLevel,
  24. Fields: make(map[string]interface{}),
  25. Out: os.Stderr,
  26. Context: context.Background(),
  27. }
  28. l := &zapLogger{opts: options}
  29. if err := l.Init(opts...); err != nil {
  30. return nil, err
  31. }
  32. return l, nil
  33. }
  34. func (l *zapLogger) Init(opts ...logger.Option) error {
  35. //var err error
  36. for _, o := range opts {
  37. o(&l.opts)
  38. }
  39. zapConfig := zap.NewProductionConfig()
  40. if zConfig, ok := l.opts.Context.Value(configKey{}).(zap.Config); ok {
  41. zapConfig = zConfig
  42. }
  43. if zeConfig, ok := l.opts.Context.Value(encoderConfigKey{}).(zapcore.EncoderConfig); ok {
  44. zapConfig.EncoderConfig = zeConfig
  45. }
  46. writer, ok := l.opts.Context.Value(writerKey{}).(io.Writer)
  47. if !ok {
  48. writer = os.Stdout
  49. }
  50. skip, ok := l.opts.Context.Value(callerSkipKey{}).(int)
  51. if !ok || skip < 1 {
  52. skip = 1
  53. }
  54. // 设置日志级别
  55. zapConfig.Level = zap.NewAtomicLevel()
  56. if l.opts.Level != logger.InfoLevel {
  57. zapConfig.Level.SetLevel(loggerToZapLevel(l.opts.Level))
  58. }
  59. zapConfig.EncoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
  60. logCore := zapcore.NewCore(
  61. zapcore.NewConsoleEncoder(zapConfig.EncoderConfig),
  62. zapcore.NewMultiWriteSyncer(zapcore.AddSync(writer)),
  63. zapConfig.Level)
  64. log := zap.New(logCore, zap.AddCaller(), zap.AddCallerSkip(skip), zap.AddStacktrace(zap.DPanicLevel))
  65. // 添加种子字段(如果存在)
  66. if l.opts.Fields != nil {
  67. var data []zap.Field
  68. for k, v := range l.opts.Fields {
  69. data = append(data, zap.Any(k, v))
  70. }
  71. log = log.With(data...)
  72. }
  73. // 添加命名空间
  74. if namespace, ok := l.opts.Context.Value(namespaceKey{}).(string); ok {
  75. log = log.With(zap.Namespace(namespace))
  76. }
  77. // defer log.Sync() ??
  78. l.cfg = zapConfig
  79. l.zap = log
  80. l.fields = make(map[string]interface{})
  81. return nil
  82. }
  83. func (l *zapLogger) Fields(fields map[string]interface{}) logger.Logger {
  84. l.Lock()
  85. newFields := make(map[string]interface{}, len(l.fields))
  86. for k, v := range l.fields {
  87. newFields[k] = v
  88. }
  89. l.Unlock()
  90. for k, v := range fields {
  91. newFields[k] = v
  92. }
  93. data := make([]zap.Field, 0, len(newFields))
  94. for k, v := range fields {
  95. data = append(data, zap.Any(k, v))
  96. }
  97. zl := &zapLogger{
  98. cfg: l.cfg,
  99. zap: l.zap,
  100. opts: l.opts,
  101. fields: newFields,
  102. }
  103. return zl
  104. }
  105. func (l *zapLogger) Error(err error) logger.Logger {
  106. return l.Fields(map[string]interface{}{"error": err})
  107. }
  108. func (l *zapLogger) Log(level logger.Level, args ...interface{}) {
  109. l.RLock()
  110. data := make([]zap.Field, 0, len(l.fields))
  111. for k, v := range l.fields {
  112. data = append(data, zap.Any(k, v))
  113. }
  114. l.RUnlock()
  115. lvl := loggerToZapLevel(level)
  116. msg := fmt.Sprint(args...)
  117. switch lvl {
  118. case zap.DebugLevel:
  119. l.zap.Debug(msg, data...)
  120. case zap.InfoLevel:
  121. l.zap.Info(msg, data...)
  122. case zap.WarnLevel:
  123. l.zap.Warn(msg, data...)
  124. case zap.ErrorLevel:
  125. l.zap.Error(msg, data...)
  126. case zap.FatalLevel:
  127. l.zap.Fatal(msg, data...)
  128. }
  129. }
  130. func (l *zapLogger) Logf(level logger.Level, format string, args ...interface{}) {
  131. l.RLock()
  132. data := make([]zap.Field, 0, len(l.fields))
  133. for k, v := range l.fields {
  134. data = append(data, zap.Any(k, v))
  135. }
  136. l.RUnlock()
  137. lvl := loggerToZapLevel(level)
  138. msg := fmt.Sprintf(format, args...)
  139. switch lvl {
  140. case zap.DebugLevel:
  141. l.zap.Debug(msg, data...)
  142. case zap.InfoLevel:
  143. l.zap.Info(msg, data...)
  144. case zap.WarnLevel:
  145. l.zap.Warn(msg, data...)
  146. case zap.ErrorLevel:
  147. l.zap.Error(msg, data...)
  148. case zap.FatalLevel:
  149. l.zap.Fatal(msg, data...)
  150. }
  151. }
  152. func (l *zapLogger) String() string {
  153. return "zap"
  154. }
  155. func (l *zapLogger) Options() logger.Options {
  156. return l.opts
  157. }
  158. func loggerToZapLevel(level logger.Level) zapcore.Level {
  159. switch level {
  160. case logger.TraceLevel, logger.DebugLevel:
  161. return zap.DebugLevel
  162. case logger.InfoLevel:
  163. return zap.InfoLevel
  164. case logger.WarnLevel:
  165. return zap.WarnLevel
  166. case logger.ErrorLevel:
  167. return zap.ErrorLevel
  168. case logger.FatalLevel:
  169. return zap.FatalLevel
  170. default:
  171. return zap.InfoLevel
  172. }
  173. }
  174. func zapToLoggerLevel(level zapcore.Level) logger.Level {
  175. switch level {
  176. case zap.DebugLevel:
  177. return logger.DebugLevel
  178. case zap.InfoLevel:
  179. return logger.InfoLevel
  180. case zap.WarnLevel:
  181. return logger.WarnLevel
  182. case zap.ErrorLevel:
  183. return logger.ErrorLevel
  184. case zap.FatalLevel:
  185. return logger.FatalLevel
  186. default:
  187. return logger.InfoLevel
  188. }
  189. }