Я строю систему на основе 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 или почему я не могу заставить его работать