ホームページ  >  記事  >  バックエンド開発  >  gRPC ミドルウェアの Uber/Zap ログを使用して Go で実際のエラー ソースを取得する

gRPC ミドルウェアの Uber/Zap ログを使用して Go で実際のエラー ソースを取得する

王林
王林転載
2024-02-09 13:18:08418ブラウズ

使用 gRPC 中间件中的 Uber/Zap 日志记录获取 Go 中的实际错误源

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

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。