Maison > développement back-end > Golang > le corps du texte

Obtenez la source d'erreur réelle dans Go en utilisant la journalisation Uber/Zap dans le middleware gRPC

王林
Libérer: 2024-02-09 13:18:08
avant
416 Les gens l'ont consulté

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

Dans cet article, l'éditeur PHP Zimo présentera comment utiliser la journalisation Uber/Zap pour obtenir la source d'erreur réelle dans le langage Go lors de l'utilisation du middleware gRPC. En utilisant ce middleware, nous pouvons mieux comprendre et suivre les erreurs dans le code, localisant et résolvant ainsi les problèmes plus rapidement. Cet article explique comment configurer et utiliser la journalisation Uber/Zap, ainsi que comment capturer et enregistrer les informations d'erreur dans les requêtes et réponses gRPC. En maîtrisant ces techniques, nous pouvons améliorer nos capacités de débogage et de gestion des erreurs dans les applications gRPC.

Contenu de la question

J'utilise le package uber/zap pour la journalisation. Dans ma conception, j'enregistre toutes les erreurs dans le middleware du package grpc. Je souhaite enregistrer le fichier et le numéro de ligne d'où provient l'erreur. Cependant, je ne peux actuellement obtenir que le nom de fichier et le numéro de ligne du middleware actuel. Existe-t-il un moyen d'obtenir la véritable source de l'erreur ?

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)
    }

}
Copier après la connexion

Solution de contournement

Dans l'implémentation actuelle, vous essayez de consigner le fichier et le numéro de ligne où l'erreur s'est produite. Cependant, les informations que vous obtenez concernent le middleware actuel et non la source réelle de l’erreur.

Pour obtenir les informations sur le fichier et la ligne de la source réelle de l'erreur, vous pouvez utiliser le package pkg/errors. Ce package fournit un moyen d'encapsuler les erreurs et de conserver les informations sur les fichiers et les lignes. Voici un exemple de la façon de modifier votre code pour y parvenir :

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
    }
}
Copier après la connexion

Lors de la journalisation d'une erreur à l'aide de errors.wrap 函数包装错误,您可以将文件和行信息添加到错误中。然后,当使用 s.log.errorw, le message de journal contiendra une trace complète de la pile, y compris les informations sur le fichier et la ligne d'où l'erreur est originaire.

De cette façon, vous pouvez utiliser les informations fournies par le package errors pour retrouver la source réelle de l'erreur.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!