go - 将 Elasticsearch 与 Logrus 集成(golang 日志记录)

标签 go elasticsearch logging error-logging logrus

我正在使用 logrus完成我的 golang 应用程序的所有日志记录。但是,我还想将它与 Elastic Search 集成,这样当我创建 logrus 日志条目时,所有日志也会刷新到 Elastic Search。目前所有日志都在一个文件中创建,如下面的代码片段所示。我如何与 Elasticsearch 集成?

type LoggerConfig struct {
    Filename string `validate:regexp=.log$`
    AppName  string `validate:regexp=^[a-zA-Z]$`
}  

type AppLogger struct {
    Err    error
    Logger logrus.Entry
}

func Logger(loggerConfig LoggerConfig) AppLogger {
    response := new(AppLogger)
    // validate the schema of the logger_config
    if errs := validator.Validate(loggerConfig); errs != nil {
        response.Err = errs
        // this sets up the error on the the response struct
    }

    logrus.SetFormatter(&logrus.JSONFormatter{})
    f, err := os.OpenFile(loggerConfig.Filename, os.O_WRONLY|os.O_CREATE, 0755)
    if err != nil {
        response.Err = err
    }
    multipleWriter := io.MultiWriter(os.Stdout, f)
    logrus.SetOutput(multipleWriter)

    contextLogger := logrus.WithFields(logrus.Fields{
        "app": loggerConfig.AppName,
    })


    //logrus.AddHook(hook)
    response.Logger = *contextLogger

    //response.Logger.Info("adele")
    return *response

}

我试过elogrus它增加了一个钩子(Hook),但我不知道如何使用它。这是尝试创建 Elasticsearch 客户端的方法。我如何将它与 logrus 实例集成?
func prepareElasticSearchClient() *elastic.Client {
    indexName := "my-server"

    client, _ := elastic.NewClientFromConfig(&config.Config{
        URL:      os.Getenv("ELASTIC_SEARCH_URL_LOGS") + ":" + os.Getenv("ELASTIC_SEARCH_PORT_LOGS"),
        Index:    indexName,
        Username: os.Getenv("ELASTIC_SEARCH_USERNAME_LOGS"),
        Password: os.Getenv("ELASTIC_SEARCH_PASSWORD_LOGS"),
    })

    return client
}

之前我使用过像 Winston 这样的模块。设置 Elasticsearch 日志记录非常容易,但不知何故,我发现很少有关于如何将 Golang 日志记录与 Elasticsearch 集成的 golang 文档

最佳答案

elogrus您首先创建 Elastic 客户端并将其传递给 elogrus使用 elogrus.NewAsyncElasticHook() 创建时 Hook . Hook 只是包装了向 Elastic 发送消息。然后将此钩子(Hook)添加到 logrus log .每次使用 log 记录消息时它会触发你的钩子(Hook)并向 Elastic 发送消息(如果日志级别过滤器通过)。

log := logrus.New()
client, err := elastic.NewClient(elastic.SetURL("http://localhost:9200"))
// ... handle err
hook, err := elogrus.NewAsyncElasticHook(client, "localhost", logrus.DebugLevel, "testlog")
// ... handle err
log.Hooks.Add(hook)
NewAsyncElasticHook的签名是 (client *elastic.Client, host string, level logrus.Level, index string)在哪里:
  • client是指向 Elastic.Client 的指针使用前获得的elastic
  • host是表示您从哪个主机发送日志跟踪的字符串(它是一个字符串 - 正在运行日志程序的主机的主机名)
  • level是您希望发送消息的最大 logrus 日志级别(例如,如果您想在本地查看 DEBUG 消息但只向 Elastic 发送 ERROR 及以下消息)
  • index是您要添加来自 log 的消息的 Elastic Search 索引的名称至

  • 从这里您可以使用 log通常就像你对 logrus 所做的那样所有消息都将传递给 Elastic。

    问题的另一部分有点棘手,并且 Root 于(不仅)Golang elastic客户端节点嗅探行为。我们在聊天中对其进行了调试,并将摘要发布为我对 OP 的另一个问题的回答:Cannot connect to elastic search : no active connection found: no Elasticsearch node available

    关于go - 将 Elasticsearch 与 Logrus 集成(golang 日志记录),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61452091/

    相关文章:

    go - 如何限制 Go 中实现的 HTTP 服务器的连接数?

    elasticsearch - 从Elasticsearch Maxed out索引中删除数据

    java - java.util.logging.Logger 的一些问题

    linux - 动态 Rsyslog 模板

    go - 如何解码 map golang

    http - 如何让 Go 的 net/http 包停止删除双斜杠?

    elasticsearch嵌套范围查询

    c# - Asp.Net MVC 默认路由

    database - GORM ORM : Preloading in both relationship directions possible?

    json - ElasticSearch查询