首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >弹性搜索与Logrus (戈朗测井)的集成

弹性搜索与Logrus (戈朗测井)的集成
EN

Stack Overflow用户
提问于 2020-04-27 05:11:02
回答 1查看 1.9K关注 0票数 0

我正在使用logrus来记录我的golang应用程序。但是,我也想将它与弹性搜索集成起来,这样当我创建一个logrus日志条目时,所有的日志都会被刷新为弹性搜索。目前,所有日志都是在一个文件中创建的,如下面的代码段所示。如何与弹性搜索相结合?

代码语言:javascript
复制
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,它增加了一个钩子,但我不知道如何使用它。下面是试图创建弹性搜索客户端的方法。我如何将它与logrus实例集成?

代码语言:javascript
复制
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这样的模块,在那里建立弹性搜索日志非常容易,但不知怎么,我发现关于如何将golang测井与弹性搜索集成的文档很少。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-27 05:45:28

使用elogrus,您首先创建弹性客户端,并在使用elogrus.NewAsyncElasticHook()创建它时将其传递给elogrus钩子。胡克刚刚包装发送信息给弹性。然后将这个钩子添加到logrus log中。每次您使用log记录消息时,它都会触发您的钩子并发送消息(如果日志级别的过滤器通过)。

代码语言:javascript
复制
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
  • host is字符串之前获得的Elastic.Client,该字符串表示您要从哪个主机发送日志跟踪(它是一个字符串--主机名,其中记录的程序是running)
  • level,是您希望发送消息的最大日志级别(例如,如果您希望在本地查看调试消息,但只发送错误,那么在Elastic)
  • index下面是要将消息从log添加到

的弹性搜索索引名称)。

从这里开始,您可以正常地使用log,就像使用logrus一样,所有的消息都会被传递给弹性。

问题的另一部分是一些棘手的问题,它植根于(不仅仅是) Golang elastic客户机节点嗅探行为。我们在聊天中对它进行了调试,并将其作为我对OP的另一个问题的回答:Cannot connect to elastic search : no active connection found: no Elasticsearch node available

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61452091

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档