github.com/shuguocloud/go-zero@v1.3.0/core/logx/tracelogger.go (about) 1 package logx 2 3 import ( 4 "context" 5 "fmt" 6 "io" 7 "time" 8 9 "github.com/shuguocloud/go-zero/core/timex" 10 "go.opentelemetry.io/otel/trace" 11 ) 12 13 type traceLogger struct { 14 logEntry 15 Trace string `json:"trace,omitempty"` 16 Span string `json:"span,omitempty"` 17 ctx context.Context 18 } 19 20 func (l *traceLogger) Error(v ...interface{}) { 21 if shallLog(ErrorLevel) { 22 l.write(errorLog, levelError, formatWithCaller(fmt.Sprint(v...), durationCallerDepth)) 23 } 24 } 25 26 func (l *traceLogger) Errorf(format string, v ...interface{}) { 27 if shallLog(ErrorLevel) { 28 l.write(errorLog, levelError, formatWithCaller(fmt.Sprintf(format, v...), durationCallerDepth)) 29 } 30 } 31 32 func (l *traceLogger) Errorv(v interface{}) { 33 if shallLog(ErrorLevel) { 34 l.write(errorLog, levelError, v) 35 } 36 } 37 38 func (l *traceLogger) Info(v ...interface{}) { 39 if shallLog(InfoLevel) { 40 l.write(infoLog, levelInfo, fmt.Sprint(v...)) 41 } 42 } 43 44 func (l *traceLogger) Infof(format string, v ...interface{}) { 45 if shallLog(InfoLevel) { 46 l.write(infoLog, levelInfo, fmt.Sprintf(format, v...)) 47 } 48 } 49 50 func (l *traceLogger) Infov(v interface{}) { 51 if shallLog(InfoLevel) { 52 l.write(infoLog, levelInfo, v) 53 } 54 } 55 56 func (l *traceLogger) Slow(v ...interface{}) { 57 if shallLog(ErrorLevel) { 58 l.write(slowLog, levelSlow, fmt.Sprint(v...)) 59 } 60 } 61 62 func (l *traceLogger) Slowf(format string, v ...interface{}) { 63 if shallLog(ErrorLevel) { 64 l.write(slowLog, levelSlow, fmt.Sprintf(format, v...)) 65 } 66 } 67 68 func (l *traceLogger) Slowv(v interface{}) { 69 if shallLog(ErrorLevel) { 70 l.write(slowLog, levelSlow, v) 71 } 72 } 73 74 func (l *traceLogger) WithDuration(duration time.Duration) Logger { 75 l.Duration = timex.ReprOfDuration(duration) 76 return l 77 } 78 79 func (l *traceLogger) write(writer io.Writer, level string, val interface{}) { 80 traceID := traceIdFromContext(l.ctx) 81 spanID := spanIdFromContext(l.ctx) 82 83 switch encoding { 84 case plainEncodingType: 85 writePlainAny(writer, level, val, l.Duration, traceID, spanID) 86 default: 87 outputJson(writer, &traceLogger{ 88 logEntry: logEntry{ 89 Timestamp: getTimestamp(), 90 Level: level, 91 Duration: l.Duration, 92 Content: val, 93 }, 94 Trace: traceID, 95 Span: spanID, 96 }) 97 } 98 } 99 100 // WithContext sets ctx to log, for keeping tracing information. 101 func WithContext(ctx context.Context) Logger { 102 return &traceLogger{ 103 ctx: ctx, 104 } 105 } 106 107 func spanIdFromContext(ctx context.Context) string { 108 spanCtx := trace.SpanContextFromContext(ctx) 109 if spanCtx.HasSpanID() { 110 return spanCtx.SpanID().String() 111 } 112 113 return "" 114 } 115 116 func traceIdFromContext(ctx context.Context) string { 117 spanCtx := trace.SpanContextFromContext(ctx) 118 if spanCtx.HasTraceID() { 119 return spanCtx.TraceID().String() 120 } 121 122 return "" 123 }