gpt4 book ai didi

scala - AKKA 中的 MDC(映射诊断上下文)日志记录

转载 作者:行者123 更新时间:2023-12-04 21:39:30 27 4
gpt4 key购买 nike

我想在我的 AKKA 应用程序上实现 logback MDC 日志记录,以组织并获得更多信息日志;但是,我还读到 MDC 可能不适用于 AKKA,因为 AKKA 具有异步日志记录系统(MDC 可能存储在不同的线程上)。我使用定义的 MDC 日志记录的自定义调度程序 here希望能解决我的问题,但我无法让它在我的应用程序上运行。我的应用程序不是一个播放框架应用程序。

我有一个 RequestHandler Actor 接收不同类型的请求并将其委托(delegate)给 RequestSpecificHandler将处理它的 Actor 。

class RequestHandler() extends Actor with akka.actor.ActorLogging {

def receive: Receive = {
//Requests
case req: RequestA =>
org.slf4j.MDC.put("messageId", req.msgId)
org.slf4j.MDC.put("requestType", req.requestType)
log.debug("FIRST LOG Received a RequestA")
val actorA = context.ActorOf(ActorA.props)
actorA ! req.msg
case req: RequestB => //...
//other requests...



//Response
case res: ResponseA =>
log.debug("Received responseA")
org.slf4j.MDC.remove("messageId")
org.slf4j.MDC.remove("requestType")
//other response
}
}

在我的 RequestSpecificHandler Actor ,我也新建或引用其他现有的 HelperActors
class ActorA () extends Actor with akka.actor.ActorLogging {

val helperA = context.actorSelection("/user/helperA")
val helperB = context.actorOf("HelperB.props")

def receive: Receive = {
case msg: MessageTypeA =>
//do some stuff
log.debug("received MessageTypeA")
helperA ! taskForA

case doneByA =>
//do some stuff
log.debug("received doneByA")
helperB ! taskForB

case doneByB =>
log.debug("send reponseA")
sender ! ResponseA
}

}

每次发送请求时,日志记录都会有所不同,有时它会使用正确的 MDC messageId 和 requestType 进行记录,有时它没有任何值。甚至 "FIRST LOG Received a RequestA" log 的行为是这样的,我认为它应该始终具有正确的日志戳,因为它在我调用 MDC.put 的同一类中

这是我的application.conf:
akka {
log-dead-letters = 10
loggers = ["akka.event.slf4j.Slf4jLogger"]
loglevel = DEBUG
logging-filter = "akka.event.slf4j.Slf4jLoggingFilter"

actor{

default-dispatcher {
type = "some.package.monitoring.MDCPropagatingDispatcherConfigurator"
}
...

如何在某个请求期间执行的所有代码日志(包括依赖库日志)都具有相同的 messageId、requestType 日志戳的情况下进行 MDC 日志记录?除了 AKKA 的自定义调度程序之外,还有其他方法可以做到这一点吗?另外,有什么更组织的方式来声明 MDC.putMDC.remove代码?现在我在收到的每个案例上都有它。

谢谢

最佳答案

akka.actor.DiagnosticActorLogging 可能应该可以解决您的问题。

关于scala - AKKA 中的 MDC(映射诊断上下文)日志记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30091356/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com