Интегрируйте elasti c поиск с Logrus (golang logging) - PullRequest
0 голосов
/ 27 апреля 2020

Я использую logrus для ведения журнала моего приложения golang. Однако я также хочу интегрировать это с Elasti c Search так, чтобы все журналы также сбрасывались в elasti c Search при создании записи журнала logrus. В настоящее время все журналы создаются в файле, как показано во фрагменте ниже. Как я могу интегрироваться с поиском elasti c?

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, который добавляет хук, но я не уверен, как его использовать. Вот метод, который пытается создать клиент поиска elasti c. Как я могу интегрировать это с экземпляром 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, где было очень легко настроить elasti c ведение журнала поиска, но каким-то образом я нашел небольшую документацию с golang о том, как интегрировать Golang ведение журнала с elasti c search

1 Ответ

1 голос
/ 27 апреля 2020

С помощью elogrus вы сначала создаете клиент Elasti c и передаете его на elogrus ловушку при создании с elogrus.NewAsyncElasticHook(). Крюк просто оборачивает отправку сообщения в Elasti c. Затем вы добавляете этот хук к logrus log. Каждый раз, когда вы регистрируете сообщение, используя log, оно запускает вашу ловушку и отправляет сообщение (если фильтр уровня журнала проходит) в Elasti c.

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 локально, но отправлять только ОШИБКУ и ниже в Elasti c)
  • index - это имя Elasti c Индекс поиска, в который вы хотите добавить сообщения от log до

Отсюда вы можете использовать log обычно, как вы делаете с logrus, и все сообщения будут переданы в Elasti c.

Другая часть проблемы была немного более сложной и коренилась в (не только) Golang elastic поведение анализатора клиентского узла. Мы отладили его в чате, и резюме было опубликовано как мой ответ на еще один вопрос OP, касающийся этого: Не удается подключиться к elasti c Поиск: не найдено активное соединение: нет доступного узла Elasticsearch

...