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