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)
}