logger_interceptor.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. package v1
  2. import (
  3. "context"
  4. "log/slog"
  5. "google.golang.org/grpc"
  6. "google.golang.org/grpc/codes"
  7. "google.golang.org/grpc/status"
  8. )
  9. type LoggerInterceptor struct {
  10. }
  11. func NewLoggerInterceptor() *LoggerInterceptor {
  12. return &LoggerInterceptor{}
  13. }
  14. func (in *LoggerInterceptor) LoggerInterceptor(ctx context.Context, request any, serverInfo *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (any, error) {
  15. resp, err := handler(ctx, request)
  16. in.loggerInterceptorDo(ctx, serverInfo.FullMethod, err)
  17. return resp, err
  18. }
  19. func (*LoggerInterceptor) loggerInterceptorDo(ctx context.Context, fullMethod string, err error) {
  20. st := status.Convert(err)
  21. var logLevel slog.Level
  22. var logMsg string
  23. switch st.Code() {
  24. case codes.OK:
  25. logLevel = slog.LevelInfo
  26. logMsg = "OK"
  27. case codes.Unauthenticated, codes.OutOfRange, codes.PermissionDenied, codes.NotFound:
  28. logLevel = slog.LevelInfo
  29. logMsg = "client error"
  30. case codes.Internal, codes.Unknown, codes.DataLoss, codes.Unavailable, codes.DeadlineExceeded:
  31. logLevel = slog.LevelError
  32. logMsg = "server error"
  33. default:
  34. logLevel = slog.LevelError
  35. logMsg = "unknown error"
  36. }
  37. logAttrs := []slog.Attr{slog.String("method", fullMethod)}
  38. if err != nil {
  39. logAttrs = append(logAttrs, slog.String("error", err.Error()))
  40. }
  41. slog.LogAttrs(ctx, logLevel, logMsg, logAttrs...)
  42. }