shao преди 1 ден
родител
ревизия
aa21469bad
променени са 4 файла, в които са добавени 94 реда и са изтрити 5 реда
  1. 3 1
      cmd/server/server.go
  2. 87 0
      logger/grpc.go
  3. 3 3
      logger/logger.go
  4. 1 1
      models/migrate.go

+ 3 - 1
cmd/server/server.go

@@ -75,7 +75,9 @@ func run() error {
 		slog.Error("failed to listen", "err", err.Error())
 		return err
 	}
-	s := grpc.NewServer()
+	s := grpc.NewServer(
+		grpc.UnaryInterceptor(logger.GRPCLoggerServerInterceptor(logger.WithGroup("grpc_s[protocol]"))),
+	)
 	grpc_health_v1.RegisterHealthServer(s, health.NewServer())
 	pb.RegisterBasicServer(s, &service.BasicServer{})
 	pb.RegisterProtocolServer(s, &service.ProtocolServer{})

+ 87 - 0
logger/grpc.go

@@ -0,0 +1,87 @@
+package logger
+
+import (
+	"context"
+	"log/slog"
+	"time"
+)
+
+import (
+	"google.golang.org/grpc"
+	"google.golang.org/grpc/codes"
+	"google.golang.org/grpc/status"
+)
+
+func GRPCLoggerClientInterceptor(logger *slog.Logger) grpc.UnaryClientInterceptor {
+	return func(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error {
+		start := time.Now()
+		logger.Info("request",
+			slog.String("method", method),
+			slog.Any("payload", req),
+		)
+
+		err := invoker(ctx, method, req, reply, cc, opts...)
+
+		duration := time.Since(start)
+		if err != nil {
+			logger.Error("response",
+				slog.String("method", method),
+				slog.Duration("duration", duration),
+				slog.String("error", err.Error()),
+			)
+		} else {
+			logger.Info("response",
+				slog.String("method", method),
+				slog.Duration("duration", duration),
+				slog.Any("reply", reply),
+			)
+		}
+
+		return err
+	}
+}
+
+func GRPCLoggerServerInterceptor(logger *slog.Logger) grpc.UnaryServerInterceptor {
+	return func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp interface{}, err error) {
+		start := time.Now()
+		method := info.FullMethod
+
+		// 在请求处理前记录
+		logger.Info("request",
+			slog.String("method", method),
+			slog.Any("payload", req),
+		)
+
+		// 调用实际的服务方法
+		resp, err = handler(ctx, req)
+
+		// 在请求处理后记录
+		duration := time.Since(start)
+		statusCode := codes.OK // 默认成功
+		if err != nil {
+			s, ok := status.FromError(err)
+			if ok {
+				statusCode = s.Code() // 从 gRPC 错误中获取状态码
+			} else {
+				statusCode = codes.Unknown // 非 gRPC 错误则视为未知
+			}
+		}
+
+		if err != nil {
+			logger.Error("response",
+				slog.String("method", method),
+				slog.Duration("duration", duration),
+				slog.String("status_code", statusCode.String()),
+				slog.String("error", err.Error()),
+			)
+		} else {
+			logger.Info("response",
+				slog.String("method", method),
+				slog.Duration("duration", duration),
+				slog.Any("reply", resp),
+			)
+		}
+
+		return resp, err
+	}
+}

+ 3 - 3
logger/logger.go

@@ -53,12 +53,12 @@ func SetupLogger(persisted bool) {
 
 	if persisted {
 		if common.LoggerConfig.Stdout {
-			logger = slog.New(slog.NewTextHandler(io.MultiWriter(lumberJackLogger, os.Stdout), opts))
+			logger = slog.New(slog.NewJSONHandler(io.MultiWriter(lumberJackLogger, os.Stdout), opts))
 		} else {
-			logger = slog.New(slog.NewTextHandler(lumberJackLogger, opts))
+			logger = slog.New(slog.NewJSONHandler(lumberJackLogger, opts))
 		}
 	} else {
-		logger = slog.New(slog.NewTextHandler(os.Stdout, opts))
+		logger = slog.New(slog.NewJSONHandler(os.Stdout, opts))
 	}
 	slog.SetDefault(logger)
 	//todo 输出到robot

+ 1 - 1
models/migrate.go

@@ -55,7 +55,7 @@ func initTable(sqlFilePath string, db *gorm.DB) error {
 func migrate(db *gorm.DB) {
 	panicHelper(db.AutoMigrate(&PatientType{}))
 	var count int64
-	db.Model(&BodyPart{}).Count(&count)
+	db.Model(&PatientType{}).Count(&count)
 	if count == 0 {
 		panicHelper(initTable("p_patient_type_202505291630.sql", db))
 	}