当前位置: 首页 > 面试题库 >

转到:创建io.Writer接口以登录到mongodb数据库

周弘盛
2023-03-14
问题内容

使用go(golang):

有没有一种方法可以创建输出到数据库的记录器?

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

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

logger := log.New(dbLogger, "dbLog: ", log.Lshortfile) logger.Print("This message will be stored in the database")

我以为 我应该只创建自己的数据库日志记录功能 ,但我很好奇是否已经可以使用该语言中的现有工具来完成此任务。

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

我仍然对这种语言有所了解,因此我可能在上面不正确地使用了一些术语。任何更正都非常欢迎。


问题答案:

这很容易log.Logger做到,因为该类型可以保证每个日志消息都可以通过io.Writer一次Writer.Write()调用传递到目标:

每个日志记录操作都会调用Writer的Write方法。一个Logger可以同时从多个goroutine中使用;它保证序列化对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 := ... // 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 中我们可以使用 命令来创建数据库,如果该数据库不存在,则会创建一个新的数据库,如果该数据库已经存在,则将切换到该数据库。使用 命令创建数据库的语法格式如下: use database_name 其中 database_name 为要创建的数据库的名称。 如果我们想要创建一个名为 biancheng 的数据库,则可以使用如下所示的命令: 数据库创建成功后,您可以使用 命令来查看当

  • 我很绝望,我刚刚使用sys和系统密码“oracle”按照此步骤创建了一个新的Oracle数据库。创建成功完成,但当我尝试远程连接到此数据库时。 通过SQLDeveloper,我发现了一个错误 并且对于用户scott/tiger(手动创建并授予连接权限)来说效果很好。 新创建的实例是TEST。如果我通过sqlplus/连接,效果很好 当我尝试连接时,说用户名/密码不连接 但听众显然知道新的实例

  • 问题内容: 我正在尝试设计一个Java swing应用程序。我想尝试并使用MVC类型的体系结构,从而使我的UI与实际逻辑分离,以访问数据并连接到数据库。我已经决定需要创建一个自定义类,其中包含连接到数据库的所有逻辑,然后在我的动作事件中针对任何特定的窗体和按钮简单地从此类中调用方法。这样,我可以切换数据库,而我需要做的所有事情(如果我有许多形式的大型代码库)是更改JDBC连接字符串以连接到orac

  • 问题内容: 当我尝试在终端中运行Mongod时,出现以下消息: 并运行mongo命令: 我试图更改/ var / lib / mongodb和/ var / log / mongodb中的permision,但仍然无法正常工作,我试图再次卸载并安装mongodb,但仍然存在相同的问题。有人可以帮忙吗?谢谢 我正在使用Ubuntu 14.04 LTS 64位 问题答案: MongoDB需要数据目录来

  • 问题内容: 因此,现在我需要创建并实现Python日志记录模块的扩展,该扩展将用于登录到我们的数据库。基本上,我们有几个python应用程序(它们都在后台运行)当前登录到文本文件的随机混合。这几乎使得不可能确定某个应用程序是否失败。 给我的问题是将所说的日志记录文本文件移动到oracle数据库。这些表已经定义好了,需要记录到什么地方,但是现在,我正在寻找添加另一个将记录到数据库的记录处理程序。 我

  • 我正在运行saml-broker-authentication示例。我在UI中看到的第一件事是一个带有使用代理选项的用户/通行证(下图)。 有没有办法跳过此表单直接进入IDP? 点击其中一个IDP后,我得到一个类似的URL: ) 任何想法如何绕过KeyCloak身份验证并通过SP(代理)直接进入IDP?谢谢。 更新:我的 TL 找到了一个静态解决方案,可以将 IDP ID 放入身份执行下的浏览器身