Maison > Article > développement back-end > Comment passer une structure dans slog logger et utiliser ses champs automatiquement ?
J'utilise le package slog. Le problème auquel je suis confronté est que lorsque j'ai la plupart des paramètres dans une structure, je dois lui transmettre trop de paramètres.
Existe-t-il un moyen de modifier le gestionnaire pour utiliser cette structure ? Tout comme ce que vous pouvez faire en python, envoyez un dictionnaire ou un objet comme contenu supplémentaire, puis extrayez-en les paramètres requis.
Maintenant, j'ai ceci :
g.l.Log( context.TODO(), slog.LevelInfo, "Sending request to server.", "Destination", m.route.destination, "Protocol", m.route.protocol, "Service Identifier", m.route.serID, "Session ID", m.GetIdentifier(), "Client Connection", client.RemoteAddr().String(), "Server Connection", destination.RemoteAddr().String(), )
Je veux faire quelque chose comme ceci :
g.l.Log( context.TODO(), slog.LevelInfo, "Sending request to server.", "message", m, "Client Connection", client.RemoteAddr().String(), "Server Connection", destination.RemoteAddr().String(), )
Que dois-je faire ?
J'ai trouvé la réponse à cette question.
J'ai intégré l'enregistreur de slogs dans mon enregistreur personnalisé.
type Logger struct { *slog.Logger }
J'écris également une fonction d'exportation pour ma structure comme ceci :
func (m *GatewayMessage) LoggableData() *xlog.RequestData { return &xlog.RequestData{ Request: m.Request.String(), OriginalRequest: m.OriginalRequest, } } func (m *GatewayMessage) PopulateGeneralLogData() []any { logData := m.LoggableData() return []any{ "Request", logData.Request, "OriginalRequest", logData.OriginalRequest, } }
J'écris ensuite une fonction d'assistance qui prend ce GatewayMessage comme paramètre avec un certain nombre de paramètres, tels que la fonction Log de slog Logger. Voici un exemple de fonctionnalité de débogage :
func LogDebug(l *xlog.Logger, ctx context.Context, msg string, m *GatewayMessage, args ...any) { var generalLogData []any = make([]any, 0) if m != nil { generalLogData = m.PopulateGeneralLogData() } args = append(args, generalLogData...) l.RuntimeDebug( ctx, msg, args..., ) }
J'utilise également un récepteur nommé RuntimeDebug
pour injecter un paramètre nommé Scope dans tous les logs.
func (l *Logger) RuntimeDebug(ctx context.Context, msg string, args ...any) { args = append(args, "Scope", "Runtime") l.Logger.Log( ctx, slog.LevelDebug, msg, args..., ) }
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!