--
>>>>>>>>>> Read the docs: http://akka.io/docs/
>>>>>>>>>> Check the FAQ: http://doc.akka.io/docs/akka/current/additional/faq.html
>>>>>>>>>> Search the archives: https://groups.google.com/group/akka-user
---
You received this message because you are subscribed to the Google Groups "Akka User List" group.
To unsubscribe from this group and stop receiving emails from it, send an email to akka-user+...@googlegroups.com.
To post to this group, send email to akka...@googlegroups.com.
Visit this group at http://groups.google.com/group/akka-user.
Hi √,I want to have MDC logging so I can organize my logs, for example according to requestId.I am tried out the example in http://doc.akka.io/docs/akka/2.3.10/scala/logging.html#MDC_values_defined_by_the_application.It works fine for a single actor, but If I'm sending a message to another Actor, the MDC values are not log on the other Actors.
class RequestHandler() extends Actor with akka.actor.DiagnosticActorLogging{override def mdc(currentMessage: Any): MDC = {currentMessage match {case req: TypeA => Map("requestId" -> req.id)case _ => Map()}}def receive: Receive = {case req: TypeA =>log.debug("RECEIVE req typeA") //logged with correct "[requestId -> someRandom]"val actorA = context.ActorOf(ActorA.props)actorA ! req //logs in actorA are do not have value on requestId (how to log them?)}}class ActorA() extends Actor with akka.actor.DiagnosticActorLogging {...} //logs of helperActors called by ActorA are not also logged with correct requestId (how to log them?)
Is it possible with AKKA MDC to log all codeLogs (including logs from dependency libs) for a certain requestId with correct MDC map values?
akka {
loggers = ["akka.event.slf4j.Slf4jLogger"]
logging-filter = "akka.event.slf4j.Slf4jLoggingFilter"
class RequestHandler() extends Actor with akka.actor.DiagnosticActorLogging{
override def mdc(currentMessage: Any): MDC = { currentMessage match {
case _ => Map() } }
def receive: Receive = {
case req: TypeA => //TypeA extends TraitWithRequestId
log.debug("RECEIVE req typeA") //logged with correct "[requestId -> someRandom]"
val thirdPartyA = context.ActorOf(thirdPartyA.props) thirdPartyA ! req
case thirdPartyResponse => //cant modify 3rd party to extend TraitWithRequestId
log.debug("RECEIVE third party response") //no value "[requestId -> ]
val actorA = context.ActorOf(ActorA.props)
val messageToActorA = (thirPartyResponse.param1, requestId)
actorA ! messageToActorA
}
}
<conversionRule conversionWord="traceToken" converterClass="kamon.trace.logging.LogbackTraceTokenConverter"/>
class RequestHandler() extends Actor with ActorLogging {
def receive: Receive = { case req: TypeA =>
val context = Kamon.tracer.newContext(req.requestId)
context.addMetada("requestId", req.requestId)
context.addMetada("otherKeyId", req.otherKeyId)
Tracer.withNewContext(context){
log.debug("RECEIVE req typeA")
val thirdPartyA = context.ActorOf(thirdPartyA.props) thirdPartyA ! req
}
}
}
logback.xml
<configuration>
<conversionRule conversionWord="requestId" converterClass="kamon.trace.logging.LogbackTraceTokenConverter"/>
<conversionRule conversionWord="otherKeyId" converterClass="kamon.trace.logging.LogbackTraceTokenConverter"/>
<conversionRule conversionWord="name" converterClass="kamon.trace.logging.LogbackTraceTokenConverter"/>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>DEBUG</level>
</filter>
<encoder>
<pattern>%date{ISO8601} [%-5level] [%requestId] [%otherKeyId] [%name] %logger{36} %X{sourceThread} - %msg%n</pattern>
</encoder>
</appender>
...
</configuration>
Thanks a lot Yann! This is super cool :D. I'm still browsing the documents, would it be possible to use other conversionRule aside from traceToken
<conversionRule conversionWord="traceToken" converterClass="kamon.trace.logging.LogbackTraceTokenConverter"/>
I am planning to put my requestId in the metaData of the traceContext but I can't find the docs on how to modify the logback.xml for rules other than "traceToken"
class RequestHandler() extends Actor with ActorLogging {def receive: Receive = {case req: TypeA =>
val context = Kamon.tracer.newContext(req.requestId)
context.addMetada("requestId", req.requestId)
context.addMetada("otherKeyId", req.otherKeyId)
Tracer.withNewContext(context){
log.debug("RECEIVE req typeA")
val thirdPartyA = context.ActorOf(thirdPartyA.props)thirdPartyA ! req
}
}
}
logback.xml
<configuration>
<conversionRule conversionWord="requestId" converterClass="kamon.trace.logging.LogbackTraceTokenConverter"/>
<conversionRule conversionWord="otherKeyId" converterClass="kamon.trace.logging.LogbackTraceTokenConverter"/>
<conversionRule conversionWord="name" converterClass="kamon.trace.logging.LogbackTraceTokenConverter"/>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>DEBUG</level>
</filter>
<encoder>
<pattern>%date{ISO8601} [%-5level] [%messageId] [%iccid] [%name] %logger{36} %X{sourceThread} - %msg%n</pattern>
</configuration>
</encoder>
</appender>
...
[%messageId] [%iccid] [%name] still output the data for traceToken instead of the value I assigned for the name and metadata of the context
Also, have you encountered this while using Kamon during startup?[error] objc[5646]: Class JavaLaunchHelper is implemented in both /Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre/bin/java and /Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre/lib/libinstrument.dylib. One of the two will be used. Which one is undefined.
On Tuesday, May 12, 2015 at 2:30:39 PM UTC+8, Yann Simon wrote:
...