Heim >Backend-Entwicklung >Golang >Kann „log.New()' von Go einen „io.Writer' verwenden, um sich direkt bei MongoDB anzumelden?

Kann „log.New()' von Go einen „io.Writer' verwenden, um sich direkt bei MongoDB anzumelden?

Susan Sarandon
Susan SarandonOriginal
2024-12-05 13:11:09392Durchsuche

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

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn