Điều này có thể dễ dàng thực hiện được vì log.Logger
kiểu đảm bảo rằng mỗi thông báo nhật ký được gửi đến io.Writer
đích với một Writer.Write()
gọi:
Mỗi thao tác ghi nhật ký thực hiện một lệnh gọi phương thức Viết của Writer. Một Logger có thể được sử dụng đồng thời từ nhiều goroutines; nó đảm bảo tuần tự hóa quyền truy cập vào Writer.
Vì vậy, về cơ bản bạn chỉ cần tạo một kiểu thực thi io.Writer
và Write()
của ai phương thức tạo một tài liệu mới với nội dung của lát byte và lưu nó trong MongoDB.
Đây là một triển khai đơn giản thực hiện điều đó:
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
}
Sử dụng nó:
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.")
Rõ ràng là nếu bạn đang sử dụng một log.Logger
khác ví dụ, đặt MongoWriter
về điều đó, ví dụ:
mylogger := log.New(mw, "", 0)
mylogger.Println("Custom logger")
Lưu ý rằng thông báo nhật ký kết thúc bằng dòng mới là log.Logger
nối nó ngay cả khi bản thân thông báo nhật ký không kết thúc bằng dòng mới. Nếu bạn không muốn ghi dòng mới kết thúc, bạn có thể chỉ cần cắt nó đi, ví dụ:
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)
}