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  }