From 02fb4152608583e4b4fda877ec803aa05cbd0332 Mon Sep 17 00:00:00 2001 From: Steven Date: Wed, 6 Mar 2024 00:43:13 +0800 Subject: [PATCH] chore: update server logger --- bin/slash/main.go | 1 - server/route/api/v1/logger_interceptor.go | 48 +++++++++++++++++++++++ server/route/api/v1/v1.go | 1 + server/server.go | 15 ++----- 4 files changed, 53 insertions(+), 12 deletions(-) create mode 100644 server/route/api/v1/logger_interceptor.go diff --git a/bin/slash/main.go b/bin/slash/main.go index d4f949f..21cad17 100644 --- a/bin/slash/main.go +++ b/bin/slash/main.go @@ -152,7 +152,6 @@ func initConfig() { println("port:", serverProfile.Port) println("mode:", serverProfile.Mode) println("version:", serverProfile.Version) - println("metric:", serverProfile.Metric) println("---") } diff --git a/server/route/api/v1/logger_interceptor.go b/server/route/api/v1/logger_interceptor.go new file mode 100644 index 0000000..b5dd2ea --- /dev/null +++ b/server/route/api/v1/logger_interceptor.go @@ -0,0 +1,48 @@ +package v1 + +import ( + "context" + "log/slog" + + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +type LoggerInterceptor struct { +} + +func NewLoggerInterceptor() *LoggerInterceptor { + return &LoggerInterceptor{} +} + +func (in *LoggerInterceptor) LoggerInterceptor(ctx context.Context, request any, serverInfo *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (any, error) { + resp, err := handler(ctx, request) + in.loggerInterceptorDo(ctx, serverInfo.FullMethod, err) + return resp, err +} + +func (*LoggerInterceptor) loggerInterceptorDo(ctx context.Context, fullMethod string, err error) { + st := status.Convert(err) + var logLevel slog.Level + var logMsg string + switch st.Code() { + case codes.OK: + logLevel = slog.LevelInfo + logMsg = "OK" + case codes.Unauthenticated, codes.OutOfRange, codes.PermissionDenied, codes.NotFound: + logLevel = slog.LevelInfo + logMsg = "client error" + case codes.Internal, codes.Unknown, codes.DataLoss, codes.Unavailable, codes.DeadlineExceeded: + logLevel = slog.LevelError + logMsg = "server error" + default: + logLevel = slog.LevelError + logMsg = "unknown error" + } + logAttrs := []slog.Attr{slog.String("method", fullMethod)} + if err != nil { + logAttrs = append(logAttrs, slog.String("error", err.Error())) + } + slog.LogAttrs(ctx, logLevel, logMsg, logAttrs...) +} diff --git a/server/route/api/v1/v1.go b/server/route/api/v1/v1.go index e396af4..b499f7b 100644 --- a/server/route/api/v1/v1.go +++ b/server/route/api/v1/v1.go @@ -40,6 +40,7 @@ func NewAPIV2Service(secret string, profile *profile.Profile, store *store.Store authProvider := NewGRPCAuthInterceptor(store, secret) grpcServer := grpc.NewServer( grpc.ChainUnaryInterceptor( + NewLoggerInterceptor().LoggerInterceptor, authProvider.AuthenticationInterceptor, ), ) diff --git a/server/server.go b/server/server.go index ac92b3d..a554408 100644 --- a/server/server.go +++ b/server/server.go @@ -10,7 +10,6 @@ import ( "github.com/google/uuid" "github.com/labstack/echo/v4" - "github.com/labstack/echo/v4/middleware" "github.com/pkg/errors" "go.uber.org/zap" @@ -34,7 +33,7 @@ type Server struct { licenseService *license.LicenseService // API services. - apiV2Service *apiv1.APIV2Service + apiV1Service *apiv1.APIV2Service } func NewServer(ctx context.Context, profile *profile.Profile, store *store.Store) (*Server, error) { @@ -52,12 +51,6 @@ func NewServer(ctx context.Context, profile *profile.Profile, store *store.Store licenseService: licenseService, } - e.Use(middleware.LoggerWithConfig(middleware.LoggerConfig{ - Format: `{"time":"${time_rfc3339}",` + - `"method":"${method}","uri":"${uri}",` + - `"status":${status},"error":"${error}"}` + "\n", - })) - // Serve frontend. frontendService := NewFrontendService(profile, store) frontendService.Serve(ctx, e) @@ -79,9 +72,9 @@ func NewServer(ctx context.Context, profile *profile.Profile, store *store.Store }) rootGroup := e.Group("") - s.apiV2Service = apiv1.NewAPIV2Service(secret, profile, store, licenseService, s.Profile.Port+1) + s.apiV1Service = apiv1.NewAPIV2Service(secret, profile, store, licenseService, s.Profile.Port+1) // Register gRPC gateway as api v1. - if err := s.apiV2Service.RegisterGateway(ctx, e); err != nil { + if err := s.apiV1Service.RegisterGateway(ctx, e); err != nil { return nil, errors.Wrap(err, "failed to register gRPC gateway") } @@ -103,7 +96,7 @@ func (s *Server) Start(ctx context.Context) error { return err } go func() { - if err := s.apiV2Service.GetGRPCServer().Serve(listen); err != nil { + if err := s.apiV1Service.GetGRPCServer().Serve(listen); err != nil { slog.Log(ctx, slog.LevelError, "failed to start grpc server") } }()