Heim >Backend-Entwicklung >Golang >Kann „log.New()' von Go einen „io.Writer' verwenden, um sich direkt bei MongoDB anzumelden?
Go: Verwendung der io.Writer-Schnittstelle für die MongoDB-Protokollierung
Es stellt sich die Frage, ob es möglich ist, einen Logger zu etablieren, der direkt an a ausgibt Datenbank, insbesondere im Kontext von MongoDB. Genauer gesagt: Kann eine io.Writer-Schnittstelle implementiert und als Anfangsparameter für log.New() bereitgestellt werden? Diese Schnittstelle würde effektiv eine direkte Protokollierung in der MongoDB-Datenbank ermöglichen.
Der herkömmliche Ansatz wäre die Erstellung einer benutzerdefinierten Datenbankprotokollierungsfunktion. Es lohnt sich jedoch zu prüfen, ob es in der Go-Sprache Optionen gibt, die diese Funktionalität bieten.
Im Kontext von MongoDB ist mgo.v2 die primäre Bibliothek, die für die Datenbankverwaltung verwendet wird. Abgesehen von GridFS fehlen jedoch io.Writer-Schnittstellen, die einem bestimmten Zweck dienen.
Trotzdem ist die Implementierung von io.Writer für die MongoDB-Protokollierung machbar. Dies basiert auf der Garantie des log.Logger-Typs, dass jede Protokollnachricht mit einem einzigen Writer.Write()-Aufruf an den angegebenen io.Writer übermittelt wird.
Implementierung eines Typs, der sich an io.Writer hält, wobei seine Write()-Methode ein Dokument erstellt, das die Nutzdaten des Byte-Slices enthält, und es in MongoDB speichert, reicht aus.
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 }
Durch die Nutzung dieser Implementierung:
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.")
Es ist wichtig zu beachten, dass Protokollnachrichten im Allgemeinen mit einer neuen Zeile enden, die von log.Logger angehängt wird, auch wenn sie nicht vorhanden ist von der eigentlichen Nachricht. Wenn Sie diesen abschließenden Zeilenumbruch lieber weglassen möchten, kürzen Sie ihn einfach:
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) }
Das obige ist der detaillierte Inhalt vonKann „log.New()' von Go einen „io.Writer' verwenden, um sich direkt bei MongoDB anzumelden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!