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

Comment passer une structure dans slog logger et utiliser ses champs automatiquement ?

WBOY
Libérer: 2024-02-06 08:10:03
avant
431 Les gens l'ont consulté

如何在 slog 记录器中传递结构并自动使用其字段?

Contenu de la question

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(),
)
Copier après la connexion

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(),
)
Copier après la connexion

Que dois-je faire ?


Réponse correcte


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

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

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

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

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!

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