...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package log
17
18 import (
19 "context"
20 "fmt"
21 "log"
22
23 "github.com/go-chi/chi/middleware"
24 "go.uber.org/zap"
25 "go.uber.org/zap/zapcore"
26 )
27
28
29 var Logger *zap.SugaredLogger
30
31 var traceStringPrefix string
32
33 func init() {
34 ConfigureLogger("dev", "")
35 }
36
37 func ConfigureLogger(logType, traceStrPrefix string) {
38 var cfg zap.Config
39 if logType == "prod" {
40 cfg = zap.NewProductionConfig()
41 cfg.EncoderConfig.LevelKey = "severity"
42 cfg.EncoderConfig.MessageKey = "message"
43 cfg.EncoderConfig.TimeKey = "time"
44 cfg.EncoderConfig.EncodeLevel = encodeLevel()
45 cfg.EncoderConfig.EncodeTime = zapcore.RFC3339NanoTimeEncoder
46 cfg.EncoderConfig.EncodeDuration = zapcore.SecondsDurationEncoder
47 cfg.EncoderConfig.EncodeCaller = zapcore.FullCallerEncoder
48 } else {
49 cfg = zap.NewDevelopmentConfig()
50 cfg.EncoderConfig.EncodeLevel = zapcore.CapitalColorLevelEncoder
51 }
52 logger, err := cfg.Build()
53 if err != nil {
54 log.Fatalln("createLogger", err)
55 }
56 Logger = logger.Sugar()
57
58 if traceStrPrefix != "" {
59 traceStringPrefix = traceStrPrefix
60 }
61 }
62
63 func encodeLevel() zapcore.LevelEncoder {
64 return func(l zapcore.Level, enc zapcore.PrimitiveArrayEncoder) {
65 switch l {
66 case zapcore.DebugLevel:
67 enc.AppendString("DEBUG")
68 case zapcore.InfoLevel:
69 enc.AppendString("INFO")
70 case zapcore.WarnLevel:
71 enc.AppendString("WARNING")
72 case zapcore.ErrorLevel:
73 enc.AppendString("ERROR")
74 case zapcore.DPanicLevel:
75 enc.AppendString("CRITICAL")
76 case zapcore.PanicLevel:
77 enc.AppendString("ALERT")
78 case zapcore.FatalLevel:
79 enc.AppendString("EMERGENCY")
80 }
81 }
82 }
83
84 var CliLogger = createCliLogger()
85
86 func createCliLogger() *zap.SugaredLogger {
87 cfg := zap.NewDevelopmentConfig()
88 cfg.EncoderConfig.TimeKey = ""
89 cfg.EncoderConfig.LevelKey = ""
90 cfg.DisableCaller = true
91 cfg.DisableStacktrace = true
92 logger, err := cfg.Build()
93 if err != nil {
94 log.Fatalln("createLogger", err)
95 }
96
97 return logger.Sugar()
98 }
99
100 func WithRequestID(ctx context.Context, id string) context.Context {
101 return context.WithValue(ctx, middleware.RequestIDKey, id)
102 }
103
104 type operation struct {
105 id string
106 }
107
108 func (o operation) MarshalLogObject(enc zapcore.ObjectEncoder) error {
109 enc.AddString("id", o.id)
110 return nil
111 }
112
113 func ContextLogger(ctx context.Context) *zap.SugaredLogger {
114 proposedLogger := Logger
115 if ctx != nil {
116 if ctxRequestID, ok := ctx.Value(middleware.RequestIDKey).(string); ok {
117 requestID := operation{ctxRequestID}
118 proposedLogger = proposedLogger.With(zap.Object("operation", requestID))
119 if traceStringPrefix != "" {
120 proposedLogger = proposedLogger.With(zap.String("logging.googleapis.com/trace", fmt.Sprintf("%s/%s", traceStringPrefix, ctxRequestID)))
121 }
122 }
123 }
124 return proposedLogger
125 }
126
View as plain text