我想在我的AKKA应用程序上实现logback MDC日志记录,以组织并拥有更具信息性的日志;但是,我还读到MDC可能不适用于AKKA,因为AKKA具有异步日志记录系统(MDC可能存储在不同的线程上)。我使用自定义调度程序进行MDC日志记录定义here希望解决我的问题,但我无法使其在我的应用程序上运行。我的应用程序不是一个游戏框架应用程序。
我有一个RequestHandler
Actor接收不同类型的请求,并将其委托给将要处理它的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
演员中,我也会创建新的或引用其他现有的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"
日志的行为也是如此,我认为它应该始终具有正确的logstamp,因为它在我调用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"
}
...
如何在某个请求期间执行的所有代码日志(包括依赖项lib日志)具有相同的messageId,requestType logstamp?除了AKKA的Custom Dispatcher之外,还有其他方法吗?此外,什么是更加组织的方式来声明MDC.put
和MDC.remove
代码?现在我收到了每个案件。
由于
答案 0 :(得分:1)
akka.actor.DiagnosticActorLogging可能会解决您的问题。