sql >> Databáze >  >> NoSQL >> MongoDB

Přejít:Vytvořte rozhraní io.Writer pro přihlášení do databáze mongodb

To je snadno proveditelné, protože log.Logger type zaručuje, že každá zpráva protokolu bude doručena do cíle io.Writer pomocí jediného Writer.Write() zavolejte:

Každá operace protokolování provede jediné volání metody Writer's Write. Logger lze používat současně z více goroutin; zaručuje serializaci přístupu k programu Writer.

Takže v podstatě stačí vytvořit typ, který implementuje io.Writer a jehož Write() metoda vytvoří nový dokument s obsahem bajtového řezu a uloží jej do MongoDB.

Zde je jednoduchá implementace, která to dělá:

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
}

Použití:

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.")

Samozřejmě, pokud používáte jiný log.Logger například nastavte MongoWriter k tomu, např.:

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

Všimněte si, že zprávy protokolu končí novým řádkem jako log.Logger připojí jej, i když samotná zpráva protokolu nekončí novým řádkem. Pokud nechcete zaznamenávat končící nový řádek, můžete jej jednoduše vystřihnout, např.:

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. Existují nějaké nástroje pro odhad velikosti indexu v MongoDB?

  2. Jak nastavit mongod.conf bind_ip s více IP adresami

  3. Aktualizujte entitu v redis pomocí spring-data-redis

  4. vlastní kompilace redis-client selhává