Maison >développement back-end >Golang >Le « log.New() » de Go peut-il utiliser un « io.Writer » pour se connecter directement à 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 }
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.")
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) }
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!