この記事では、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 中国語 Web サイトの他の関連記事を参照してください。