이 기사에서는 PHP 편집자 Zimo가 gRPC 미들웨어 사용 시 Uber/Zap 로깅을 사용하여 Go 언어에서 실제 오류 소스를 얻는 방법을 소개합니다. 이 미들웨어를 사용하면 코드의 오류를 더 잘 이해하고 추적할 수 있으므로 문제를 더 빠르게 찾아 해결할 수 있습니다. 이 문서에서는 Uber/Zap 로깅을 구성 및 사용하는 방법과 gRPC 요청 및 응답에서 오류 정보를 캡처하고 기록하는 방법을 자세히 설명합니다. 이러한 기술을 익히면 gRPC 애플리케이션의 디버깅 및 오류 처리 기능을 향상시킬 수 있습니다.
로깅을 위해 uber/zap 패키지를 사용하고 있습니다. 내 디자인에서는 grpc 패키지 미들웨어의 모든 오류를 기록합니다. 오류가 발생한 파일과 줄 번호를 기록하고 싶습니다. 그러나 현재는 현재 미들웨어의 파일 이름과 줄 번호만 가져올 수 있습니다. 오류의 실제 원인을 확인할 수 있는 방법이 있습니까?
func RegisterLogger(c config.Config) *zap.SugaredLogger { var logger *zap.Logger var err error if c.IsDebug { logger, err = zap.NewDevelopment() } else { logger, err = zap.NewProduction() } if err != nil { panic(err) } defer logger.Sync() return logger.Sugar() } func (s *ProviderServer) Pay(ctx context.Context, in *payment.PayRequest) (string, error) { resp, err := ctx.Value(in.Provider).(provider.IPayment).Exec(ctx, in) if err != nil { pc, file, line, ok := runtime.Caller(2) if ok { file = filepath.Base(file) nowTime := time.Now().Format("2006/01/02 15:04:05") funcName := runtime.FuncForPC(pc).Name() funcName = filepath.Ext(funcName) funcName = strings.TrimPrefix(funcName, ".") s.log.Info("Times:", i, " nowTime:", nowTime, " file:", file, " line:", line, " funcName:", funcName, " err:", err) } //Log the error information, including which file the error comes from. return resp.Result, err } else { s.log.Info("resp:", resp) } }
현재 구현에서는 오류가 발생한 파일과 줄 번호를 기록하려고 합니다. 그러나 귀하가 얻는 정보는 현재 미들웨어에 대한 것이며 오류의 실제 원인이 아닙니다.
오류의 실제 원인에 대한 파일 및 줄 정보를 얻으려면 pkg/errors
패키지를 사용할 수 있습니다. 이 패키지는 오류를 래핑하고 파일 및 줄 정보를 보존하는 방법을 제공합니다. 이를 달성하기 위해 코드를 수정하는 방법의 예는 다음과 같습니다.
errors.wrap
函数包装错误,您可以将文件和行信息添加到错误中。然后,当使用 s.log.errorw
를 사용하여 오류를 기록할 때 로그 메시지에는 오류가 발생한 파일 및 줄 정보를 포함하여 전체 스택 추적이 포함됩니다.
이 방법으로 errors
패키지에서 제공하는 정보를 사용하여 오류의 실제 원인을 추적할 수 있습니다.
위 내용은 gRPC 미들웨어에서 Uber/Zap 로깅을 사용하여 Go에서 실제 오류 소스를 가져옵니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!