Использование Go-Kit Logger API отсутствуют методы - PullRequest
1 голос
/ 06 октября 2019

Я хочу использовать регистратор из репозитория go kit , и я увидел, что автор также предоставил logrus API / factory, пытаясь протестировать его с некоторыми общими функциями API:например, logrus, withFields и error / info / panic и т. д. Я не мог использовать их только для журналов. Есть идеи, как добавить отсутствующие функции журнала?

logrus.WithField API.

это то, что мне не хватает

  log.WithFields(log.Fields{
    "animal": "walrus",
  }).Info("A walrus appears")

, а также информация / ошибка / отладка и т. Д.

Это то, что я пробовал

package main

import (
   log "github.com/go-kit/kit/log/logrus"
   "github.com/sirupsen/logrus"
)

func main() {

   logrusLogger := logrus.New()

   logrusLogger.Formatter = &logrus.JSONFormatter{TimestampFormat: "02-01-2006 15:04:05"}
   logger := log.NewLogrusLogger(logrusLogger)

    logger.Log("hello", "world”)  //working

   logger.WithFields(    //doesnt work

    logger.Info(      //doesnt work

}

Регистратор имеет тип logrus, но я не могу использовать withFields ИЛИ info / error / debug и т. Д., Есть идеи, что мне здесь не хватает? как log log создать какую-то фабрику, есть ли способ использовать API logrus?

1 Ответ

1 голос
/ 06 октября 2019

Это потому, что log.NewLogrusLogger() создает неэкспортированный logruslogger, который имеет только один метод Log (удовлетворяющий интерфейсу log.Logger). Он не поддерживает другие методы из самого logrus.

Этот метод Log может принимать аргументы в парах ключ-значение и помещать их в logrus.Fields при ведении журнала. Поэтому, если вы сделаете Log("hello", "world"), для поля hello будет установлено значение world. Но это не будет работать для level или других функций.

Однако, поскольку logrus.FieldLogger встроен в реализацию logruslogger, мы можем утверждать, что наш регистратор ведет себя как logrus.FieldLogger, а затем сделать это:

package main

import (
    log "github.com/go-kit/kit/log/logrus"
    "github.com/sirupsen/logrus"
)

func main() {

    logrusLogger := logrus.New()

    logrusLogger.Formatter = &logrus.JSONFormatter{TimestampFormat: "02-01-2006 15:04:05"}
    logger := log.NewLogrusLogger(logrusLogger).(logrus.FieldLogger)

    logger.Error("Hello")
    logger.Warn("Warning you")

    logger.WithField("good", "bad").Infoln("is it good or bad?")

}

Я надеюсьэто помогает. Но так как они раскрыли только метод Log, за ними могут быть сознательные дизайнерские решения. Вы можете продолжать использовать только Log или если вам нужна большая гибкость, я бы предложил настроить ваш собственный регистратор (используя logrus) вместо того, что я только что сделал выше. Это было бы более чистым подходом ИМО.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...