tracelogger.go 2.6 KB

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