将弹性搜索与 Logrus(golang 日志记录)集成
Integrate elastic search with Logrus (golang logging)
我正在使用 logrus
来记录我的 golang 应用程序。但是,我还想将它与 Elastic Search 集成,这样当我创建 logrus 日志条目时,所有日志也会刷新到 Elastic Search。目前,所有日志都创建在一个文件中,如下面的代码片段所示。我如何与弹性搜索集成?
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 实例集成?
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 日志记录与弹性搜索集成的 golang 文档
使用 elogrus
时,您首先创建 Elastic 客户端并在使用 elogrus.NewAsyncElasticHook()
创建它时将其传递给 elogrus
挂钩。 Hook 只是包装发送消息到 Elastic。然后将此挂钩添加到 logrus
log
。每次您使用 log
记录消息时,它都会触发您的钩子并将消息(如果日志级别过滤器通过)发送到 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
之前获得的 Elastic.Client
的指针
host
是表示您从哪个主机发送日志跟踪的字符串(它是一个字符串 - 记录程序所在主机的主机名 运行)
level
是您希望发送消息的最大 logrus 日志级别(例如,如果您希望在本地查看 DEBUG 消息但仅将 ERROR 及以下消息发送到 Elastic)
index
是您要将消息从 log
添加到 的 Elastic Search 索引的名称
从这里您可以像使用 logrus
一样正常使用 log
,所有消息都将传递到 Elastic。
问题的另一部分有点棘手,并且(不仅)植根于 Golang elastic
客户端节点嗅探行为。我们在聊天中对其进行了调试,并将摘要发布为我对 OP 的另一个问题的回答:
我正在使用 logrus
来记录我的 golang 应用程序。但是,我还想将它与 Elastic Search 集成,这样当我创建 logrus 日志条目时,所有日志也会刷新到 Elastic Search。目前,所有日志都创建在一个文件中,如下面的代码片段所示。我如何与弹性搜索集成?
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 实例集成?
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 日志记录与弹性搜索集成的 golang 文档
使用 elogrus
时,您首先创建 Elastic 客户端并在使用 elogrus.NewAsyncElasticHook()
创建它时将其传递给 elogrus
挂钩。 Hook 只是包装发送消息到 Elastic。然后将此挂钩添加到 logrus
log
。每次您使用 log
记录消息时,它都会触发您的钩子并将消息(如果日志级别过滤器通过)发送到 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
之前获得的 host
是表示您从哪个主机发送日志跟踪的字符串(它是一个字符串 - 记录程序所在主机的主机名 运行)level
是您希望发送消息的最大 logrus 日志级别(例如,如果您希望在本地查看 DEBUG 消息但仅将 ERROR 及以下消息发送到 Elastic)index
是您要将消息从log
添加到 的 Elastic Search 索引的名称
Elastic.Client
的指针
从这里您可以像使用 logrus
一样正常使用 log
,所有消息都将传递到 Elastic。
问题的另一部分有点棘手,并且(不仅)植根于 Golang elastic
客户端节点嗅探行为。我们在聊天中对其进行了调试,并将摘要发布为我对 OP 的另一个问题的回答: