首頁 > 後端開發 > Golang > 主體

使用 gRPC 中間件中的 Uber/Zap 日誌記錄取得 Go 中的實際錯誤來源

王林
發布: 2024-02-09 13:18:08
轉載
417 人瀏覽過

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

php小編子墨在本文中將介紹如何在使用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 套件。該套件提供了一種包裝錯誤並保留文件和行資訊的方法。以下是如何修改程式碼以實現此目的的範例:

import (
    "github.com/pkg/errors"
)

// ...

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 {
        // Wrap the error with file and line information
        err = errors.Wrap(err, "pay error")

        // Log the wrapped error
        s.log.Errorw("Error occurred", "error", err)

        return resp.Result, err
    } else {
        s.log.Infow("Request processed successfully", "response", resp)
        return resp.Result, nil
    }
}
登入後複製

透過使用 errors.wrap 函數包裝錯誤,您可以將檔案和行資訊加入錯誤。然後,當使用 s.log.errorw 記錄錯誤時,日誌訊息將包含完整的堆疊追蹤,包括錯誤起源的檔案和行資訊。

這樣,您就可以使用 errors 套件提供的資訊來追蹤錯誤的實際來源。

以上是使用 gRPC 中間件中的 Uber/Zap 日誌記錄取得 Go 中的實際錯誤來源的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!