Вход в потоки с MDC - PullRequest
       6

Вход в потоки с MDC

0 голосов
/ 17 апреля 2019

Я строю систему на основе Akka Streams, и я хочу регистрировать каждый шаг / поток в потоке и добавлять идентификатор, чтобы иметь возможность отслеживать элементы, проходящие через поток в журнале.

Я вижу, что метод журнала в потоке принимает неявное LoggingAdapter , и я обнаружил, что DiagnosticLoggingAdapter может принимать карту параметров MDC.

Моя задача - выяснить, как получить DiagnosticLoggingAdapter

Я пробовал различные способы получить регистратор, который может принимать параметры MDC, но я что-то упустил.

Сначала я только что использовал Logger из скалярной логики:

class testClass()(implicit system: ActorSystem, mat: ActorMaterializer, ext: ExecutionContext){

  val log = Logger(getClass)

  def doThisFlow: Flow[ElementIn, ElementOut, NotUsed] = Flow[ElementIn].mapAsync(1)(ei => {

        Source.single(ei)
          .log("Starting of the stream")
          .via(someFlow)
          .log("Handling some flow")
          .runWith(Sink.head)
  })
}

Это работает без параметров MDC.

Затем я попытался добавить параметры MDC через логирование scala, как описано здесь

class testClass()(implicit system: ActorSystem, mat: ActorMaterializer, ext: ExecutionContext){

  val logger = Logger.takingImplicit[MDCLoggerObject](this.getClass.getName)

  def doThisFlow: Flow[ElementIn, ElementOut, NotUsed] = Flow[ElementIn].mapAsync(1)(ei => {

    implicit val mDCLoggerObject: MDCLoggerObject = MDCLoggerObject("some value", ei.id, ei.name)

        logger.debug("Starting the stream")

        Source.single(ei)
          .log("Starting of the stream")
          .via(someFlow)
          .log("Handling some flow")
          .runWith(Sink.head)
  })
}

Но это только добавило параметры MDC к явным письменным операторам журнала, а не к операторам журнала, записанным потоковым методом log (). Это имеет смысл, поскольку этот подход использует объект LoggerTakingImplicit, а не LoggingAdapter.

Затем я попытался получить LoggingAdapter через библиотеку akka.event.Logging, вдохновленную тем, что описано здесь :

class testClass()(implicit system: ActorSystem, mat: ActorMaterializer, ext: ExecutionContext){

  val logging = Logging.getLogger(system.eventStream, "whatever")

    def doThisFlow: Flow[ElementIn, ElementOut, NotUsed] = Flow[ElementIn].mapAsync(1)(ei => {

    Source.single(ei)
      .log("Starting of the stream")
      .via(someFlow)
      .log("Handling some flow")
      .runWith(Sink.head)
  })
}

Затем неожиданно объекты, прошедшие через поток, были напечатаны после сообщения журнала, записанного в методе log ().

Я хотел бы выяснить, как получить DiagnosticLoggingAdapter с помощью методов getMDC или clearMDC. Кто-нибудь может объяснить, как получить DiagnosticLoggingAdapter или почему я не могу заставить его работать

...