gpt4 book ai didi

mongodb - Go:创建 io.Writer 接口(interface)用于记录到 mongodb 数据库

转载 作者:IT王子 更新时间:2023-10-29 01:01:56 26 4
gpt4 key购买 nike

使用 go(golang):

有没有办法创建一个输出到数据库的记录器?

或者更准确地说,我能否实现某种 io.Writer 接口(interface),我可以将其作为第一个参数传递给 log.New()

EG:(dbLogger 会接收日志的输出并将其写入数据库)

logger := log.New(dbLogger, "dbLog: ", log.Lshortfile)
logger.Print("这条消息将被存储在数据库中")

我会假设我应该只创建自己的数据库日志记录功能,但我很好奇是否已经有一种方法可以使用该语言中的现有工具来做到这一点。

在某些情况下,我使用 mgo.v2处理我的 mongodb 数据库,但除了 GridFS 之外我没有看到任何 io.Writer 接口(interface),我认为它解决了另一个问题。

我也仍然在了解这门语言,所以我可能不正确地使用了上面的一些术语。非常欢迎任何更正。

最佳答案

这很容易做到,因为 log.Logger type 保证每条日志消息都被传送到目的地 io.Writer使用单个 Writer.Write() 调用:

Each logging operation makes a single call to the Writer's Write method. A Logger can be used simultaneously from multiple goroutines; it guarantees to serialize access to the Writer.

所以基本上你只需要创建一个实现 io.Writer 的类型,它的 Write() 方法用字节 slice 的内容创建一个新文档,并将其保存在 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 := ... // 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.")

显然,如果您正在使用另一个 log.Logger 实例,请将 MongoWriter 设置为该实例,例如:

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

请注意,日志消息以换行符结尾,因为 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 is the same

return origLen, nil // Must return original length (we resliced p)
}

关于mongodb - Go:创建 io.Writer 接口(interface)用于记录到 mongodb 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40396499/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com