log.go 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. package logs
  2. import (
  3. "context"
  4. "go.uber.org/zap"
  5. "go.uber.org/zap/zapcore"
  6. "gogs.tyduyong.com/duyong/dy-pkg/app/options"
  7. "sync"
  8. )
  9. var (
  10. std = New(options.NewLogOptions())
  11. mu sync.Mutex
  12. )
  13. func Init(opts *options.LogOptions) {
  14. mu.Lock()
  15. defer mu.Unlock()
  16. std = New(opts)
  17. }
  18. func New(opts *options.LogOptions) *zapLogger {
  19. if opts == nil {
  20. opts = options.NewLogOptions()
  21. }
  22. var zapLevel zapcore.Level
  23. if err := zapLevel.UnmarshalText([]byte(opts.Level)); err != nil {
  24. zapLevel = zapcore.InfoLevel
  25. }
  26. encodeLevel := zapcore.CapitalLevelEncoder
  27. // when output to local path, with color is forbidden
  28. if opts.Format == "console" && opts.EnableColor {
  29. encodeLevel = zapcore.CapitalColorLevelEncoder
  30. }
  31. encoderConfig := zapcore.EncoderConfig{
  32. MessageKey: "message",
  33. LevelKey: "level",
  34. TimeKey: "timestamp",
  35. NameKey: "logger",
  36. CallerKey: "caller",
  37. StacktraceKey: "stacktrace",
  38. LineEnding: zapcore.DefaultLineEnding,
  39. EncodeLevel: encodeLevel,
  40. EncodeTime: timeEncoder,
  41. EncodeDuration: milliSecondsDurationEncoder,
  42. EncodeCaller: zapcore.ShortCallerEncoder,
  43. }
  44. loggerConfig := &zap.Config{
  45. Level: zap.NewAtomicLevelAt(zapLevel),
  46. Development: opts.Development,
  47. DisableCaller: opts.DisableCaller,
  48. DisableStacktrace: opts.DisableStacktrace,
  49. Sampling: &zap.SamplingConfig{
  50. Initial: 100,
  51. Thereafter: 100,
  52. },
  53. Encoding: opts.Format,
  54. EncoderConfig: encoderConfig,
  55. OutputPaths: opts.OutputPaths,
  56. ErrorOutputPaths: opts.ErrorOutputPaths,
  57. }
  58. var err error
  59. l, err := loggerConfig.Build(zap.AddStacktrace(zapcore.PanicLevel), zap.AddCallerSkip(1))
  60. if err != nil {
  61. panic(err)
  62. }
  63. logger := &zapLogger{
  64. zapLogger: l.Named(opts.Name),
  65. }
  66. zap.RedirectStdLog(l)
  67. return logger
  68. }
  69. type zapLogger struct {
  70. zapLogger *zap.Logger
  71. }
  72. func Debug(msg string, fields ...Field) {
  73. std.zapLogger.Debug(msg, fields...)
  74. }
  75. func (l *zapLogger) Debug(msg string, fields ...Field) {
  76. l.zapLogger.Debug(msg, fields...)
  77. }
  78. func Debugf(format string, v ...interface{}) {
  79. std.zapLogger.Sugar().Debugf(format, v...)
  80. }
  81. func (l *zapLogger) Debugf(format string, v ...interface{}) {
  82. l.zapLogger.Sugar().Debugf(format, v...)
  83. }
  84. func Info(msg string, fields ...Field) {
  85. std.zapLogger.Info(msg, fields...)
  86. }
  87. func (l *zapLogger) Info(msg string, fields ...Field) {
  88. l.zapLogger.Info(msg, fields...)
  89. }
  90. func Infof(format string, v ...interface{}) {
  91. std.zapLogger.Sugar().Infof(format, v...)
  92. }
  93. func (l *zapLogger) Infof(format string, v ...interface{}) {
  94. l.zapLogger.Sugar().Infof(format, v...)
  95. }
  96. func Warn(msg string, fields ...Field) {
  97. std.zapLogger.Warn(msg, fields...)
  98. }
  99. func (l *zapLogger) Warn(msg string, fields ...Field) {
  100. l.zapLogger.Warn(msg, fields...)
  101. }
  102. func Warnf(format string, v ...interface{}) {
  103. std.zapLogger.Sugar().Warnf(format, v...)
  104. }
  105. func (l *zapLogger) Warnf(format string, v ...interface{}) {
  106. l.zapLogger.Sugar().Warnf(format, v...)
  107. }
  108. func Error(msg string, fields ...Field) {
  109. std.zapLogger.Error(msg, fields...)
  110. }
  111. func (l *zapLogger) Error(msg string, fields ...Field) {
  112. l.zapLogger.Error(msg, fields...)
  113. }
  114. func Errorf(format string, v ...interface{}) {
  115. std.zapLogger.Sugar().Errorf(format, v...)
  116. }
  117. func (l *zapLogger) Errorf(format string, v ...interface{}) {
  118. l.zapLogger.Sugar().Errorf(format, v...)
  119. }
  120. func Panic(msg string, fields ...Field) {
  121. std.zapLogger.Panic(msg, fields...)
  122. }
  123. func (l *zapLogger) Panic(msg string, fields ...Field) {
  124. l.zapLogger.Panic(msg, fields...)
  125. }
  126. func Panicf(format string, v ...interface{}) {
  127. std.zapLogger.Sugar().Panicf(format, v...)
  128. }
  129. func (l *zapLogger) Panicf(format string, v ...interface{}) {
  130. l.zapLogger.Sugar().Panicf(format, v...)
  131. }
  132. func Fatal(msg string, fields ...Field) {
  133. std.zapLogger.Fatal(msg, fields...)
  134. }
  135. func (l *zapLogger) Fatal(msg string, fields ...Field) {
  136. l.zapLogger.Fatal(msg, fields...)
  137. }
  138. func Fatalf(format string, v ...interface{}) {
  139. std.zapLogger.Sugar().Fatalf(format, v...)
  140. }
  141. func (l *zapLogger) Fatalf(format string, v ...interface{}) {
  142. l.zapLogger.Sugar().Fatalf(format, v...)
  143. }
  144. func L(ctx context.Context) *zapLogger {
  145. return std.L(ctx)
  146. }
  147. func (l *zapLogger) L(ctx context.Context) *zapLogger {
  148. lg := l.clone()
  149. if requestID := ctx.Value(KeyRequestID); requestID != nil {
  150. lg.zapLogger = lg.zapLogger.With(zap.Any(KeyRequestID, requestID))
  151. }
  152. if username := ctx.Value(KeyUsername); username != nil {
  153. lg.zapLogger = lg.zapLogger.With(zap.Any(KeyUsername, username))
  154. }
  155. return lg
  156. }
  157. func (l *zapLogger) clone() *zapLogger {
  158. c := *l
  159. return &c
  160. }
  161. func Flush() { std.Flush() }
  162. func (l *zapLogger) Flush() {
  163. _ = l.zapLogger.Sync()
  164. }