Go:利用io.Writer 介面進行MongoDB 日誌
問題是是否可以建立一個直接輸出到資料庫,特別是在MongoDB上下文中。更準確地說,是否可以實現 io.Writer 介面並將其作為 log.New() 的初始參數提供?此介面將有效地啟用對 MongoDB 資料庫的直接日誌記錄。
傳統方法是建立自訂資料庫日誌記錄函數。然而,值得探索的是 Go 語言中是否存在提供此功能的現有選項。
在 MongoDB 上下文中,mgo.v2 是用於資料庫處理的主要函式庫。然而,除了 GridFS 之外,它還缺少 io.Writer 接口,而 GridFS 有其獨特的用途。
儘管如此,為 MongoDB 日誌記錄實作 io.Writer 是可行的。這是基於 log.Logger 類型保證透過單一 Writer.Write() 呼叫將每個日誌訊息傳遞到指定的 io.Writer。
實作遵循 io.Writer 的類型,其中它的 Write() 方法建立一個包含位元組切片有效負載的文件並將其保存在 MongoDB 中,就足夠了。
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 }
利用此實現:
sess := ... // Obtain a MongoDB session mw := &MongoWriter{sess} log.SetOutput(mw) // The default Logger of the log package now utilizes our MongoWriter. // Generate a log message for insertion into MongoDB: log.Println("I'm the inaugural log message.") log.Println("I'm multi-line,\nbut remain within a single log message.")
需要注意的是,日誌訊息通常以換行符結尾,即使實際訊息中沒有換行符,該換行符也會由log.Logger 附加。如果您希望省略此終止換行符,只需修剪它即可:
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 remains unchanged return origLen, nil // Original length must be returned (due to p being resliced) }
以上是Go 的 log.New() 可以使用 io.Writer 直接登入 MongoDB 嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!