Ini mudah dilakukan, karena log.Logger
type menjamin bahwa setiap pesan log dikirim ke io.Writer
tujuan dengan satu Writer.Write()
hubungi:
Setiap operasi logging membuat satu panggilan ke metode Writer Writer. Logger dapat digunakan secara bersamaan dari beberapa goroutine; itu menjamin untuk membuat serial akses ke Writer.
Jadi pada dasarnya Anda hanya perlu membuat tipe yang mengimplementasikan io.Writer
, dan yang Write()
metode membuat dokumen baru dengan isi potongan byte, dan menyimpannya di MongoDB.
Inilah implementasi sederhana yang melakukan itu:
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
}
Menggunakannya:
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.")
Jelas jika Anda menggunakan log.Logger
lain misalnya, atur MongoWriter
untuk itu, misalnya:
mylogger := log.New(mw, "", 0)
mylogger.Println("Custom logger")
Perhatikan bahwa pesan log diakhiri dengan baris baru sebagai log.Logger
menambahkannya bahkan jika pesan log itu sendiri tidak diakhiri dengan baris baru. Jika Anda tidak ingin mencatat akhir baris baru, Anda cukup memotongnya, mis.:
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)
}