sql >> Database >  >> NoSQL >> MongoDB

Ga:maak io.Writer-interface om in te loggen op de mongodb-database

Dit is gemakkelijk te doen, omdat de log.Logger type garandeert dat elk logbericht wordt afgeleverd op de bestemming io.Writer met een enkele Writer.Write() bel:

Elke logbewerking maakt een enkele aanroep van de Writer's Write-methode. Een Logger kan tegelijkertijd vanuit meerdere goroutines worden gebruikt; het garandeert dat toegang tot de Writer wordt geserialiseerd.

Dus eigenlijk hoef je alleen maar een type aan te maken dat io.Writer . implementeert , en wiens Write() methode maakt een nieuw document aan met de inhoud van het bytesegment en slaat het op in de MongoDB.

Hier is een eenvoudige implementatie die dat doet:

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
}

Het gebruiken:

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

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

// Now the default Logger of the log package uses our MongoWriter.
// Generate a log message that will be inserted into MongoDB:
log.Println("I'm the first log message.")
log.Println("I'm multi-line,\nbut will still be in a single log message.")

Uiteraard als u een andere log.Logger gebruikt stel bijvoorbeeld de MongoWriter . in daarop, bijv.:

mylogger := log.New(mw, "", 0)
mylogger.Println("Custom logger")

Merk op dat de logberichten eindigen met newline als log.Logger voegt het toe, zelfs als het logbericht zelf niet eindigt op newline. Als u de eindigende nieuwe regel niet wilt loggen, kunt u deze eenvoudig knippen, bijvoorbeeld:

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 is the same

    return origLen, nil // Must return original length (we resliced p)
}



  1. Spring boot starter data rest, @Notnull beperking werkt niet

  2. MongoDB-documenten verwijderen door een bestand te importeren

  3. maak en update meerdere MongoDB-documenten in één gesprek

  4. Proactieve MongoDB Monitoring (Developer Studio/Advisors-hoek)