MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Idź:Utwórz interfejs io.Writer do logowania do bazy danych mongodb

Jest to łatwe do wykonania, ponieważ log.Logger type gwarantuje, że każdy komunikat dziennika zostanie dostarczony do miejsca docelowego io.Writer z jednym Writer.Write() zadzwoń:

Każda operacja rejestrowania powoduje jedno wywołanie metody Write Writer's. Logger może być używany jednocześnie z wielu gorutyn; gwarantuje serializację dostępu do programu Writer.

Więc w zasadzie wystarczy stworzyć typ, który implementuje io.Writer i którego Write() Metoda tworzy nowy dokument z zawartością wycinka bajtowego i zapisuje go w MongoDB.

Oto prosta implementacja, która to robi:

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
}

Korzystanie z niego:

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

Oczywiście, jeśli używasz innego log.Logger przykład, ustaw MongoWriter do tego, np.:

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

Zauważ, że komunikaty dziennika kończą się znakiem nowej linii jako log.Logger dołącza go, nawet jeśli sam opis zmian nie kończy się znakiem nowej linii. Jeśli nie chcesz rejestrować końcowego znaku nowej linii, możesz go po prostu wyciąć, np.:

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. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Przedstawiamy wykresy wyszukiwania w MongoDB

  2. Spring Data MongoDB:Projekcje i agregacje

  3. Jak nasłuchiwać zmian w kolekcji MongoDB?

  4. $rozwiń pustą tablicę

  5. Warunek zapytania MongoDb przy porównaniu 2 pól