Maison > développement back-end > Golang > Le « log.New() » de Go peut-il utiliser un « io.Writer » pour se connecter directement à MongoDB ?

Le « log.New() » de Go peut-il utiliser un « io.Writer » pour se connecter directement à MongoDB ?

Susan Sarandon
Libérer: 2024-12-05 13:11:09
original
396 Les gens l'ont consulté

Can Go's `log.New()` use an `io.Writer` to directly log to MongoDB?

Go : Utilisation de l'interface io.Writer pour la journalisation MongoDB

La question se pose de savoir s'il est possible d'établir un enregistreur qui sort directement vers un base de données, notamment dans le contexte de MongoDB. Plus précisément, une interface io.Writer peut-elle être implémentée et fournie comme paramètre initial de log.New() ? Cette interface permettrait effectivement une journalisation directe dans la base de données MongoDB.

L'approche conventionnelle consisterait à créer une fonction de journalisation de base de données personnalisée. Cependant, il vaut la peine d'explorer s'il existe des options existantes dans le langage Go qui fournissent cette fonctionnalité.

Dans le contexte de MongoDB, mgo.v2 est la principale bibliothèque utilisée pour la gestion des bases de données. Cependant, il lui manque des interfaces io.Writer en dehors de GridFS, qui remplissent un objectif distinct.

Malgré cela, l'implémentation de io.Writer pour la journalisation MongoDB est réalisable. Cela repose sur la garantie du type log.Logger que chaque message de journal est transmis au io.Writer désigné avec une seule invocation Writer.Write().

Implémentation d'un type qui adhère à io.Writer, dans lequel sa méthode Write() crée un document contenant la charge utile de la tranche d'octets et le conserve dans MongoDB, suffit.

type MongoWriter struct {
    sess *mgo.Session
}

func (mw *MongoWriter) Write(p []byte) (n int, err error) {
    c := mw.sess.DB("").C("log")
    err = c.Insert(bson.M{
        "created": time.Now(),
        "msg":     string(p),
    })
    if err != nil {
        return
    }
    return len(p), nil
}
Copier après la connexion

Par exploiter cette implémentation :

sess := ... // Obtain a MongoDB session

mw := &MongoWriter{sess}
log.SetOutput(mw)

// The default Logger of the log package now utilizes our MongoWriter.
// Generate a log message for insertion into MongoDB:
log.Println("I'm the inaugural log message.")
log.Println("I'm multi-line,\nbut remain within a single log message.")
Copier après la connexion

Il est important de noter que les messages de journal se terminent généralement par une nouvelle ligne, qui est ajoutée par log.Logger même en son absence dans le message réel. Si vous préférez omettre cette nouvelle ligne de fin, coupez-la simplement :

func (mw *MongoWriter) Write(p []byte) (n int, err error) {
    origLen := len(p)
    if len(p) > 0 && p[len(p)-1] == '\n' {
        p = p[:len(p)-1] // Cut terminating newline
    }

    c := mw.sess.DB("").C("log")

    // ... the rest remains unchanged

    return origLen, nil // Original length must be returned (due to p being resliced)
}
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:php.cn
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal