Quelle est la différence entre ActorLogging
et DiagnosticActorLogging
traits dans Akka
et quand devriez-vous favoriser l'un sur l'autre? Un rapide coup d'œil à la docs ne fournit pas beaucoup de conseils.Quand utiliser DiagnosticActorLogging au lieu des caractères ActorLogging dans Akka?
Répondre
MDC vous permet d'ajouter du contexte aux messages que vous consignez. Par exemple, avec un motif d'enregistrement %5p %X{user-id} %m%n
, l'insertion user-id
sur la carte mdc remplacera la valeur dans le champ de modèle %X{user-id}
DiagnosticActorLogging
vous offre un accès facile à mdc
et prend soin de fixer et de compensation fg pour chaque message traité par l'acteur. Jetez un oeil à la méthode aroundReceive
en DiagnosticActorLogging
trait pour mieux le comprendre
override protected[akka] def aroundReceive(receive: Actor.Receive, msg: Any): Unit = try {
log.mdc(mdc(msg))
super.aroundReceive(receive, msg)
} finally {
log.clearMDC()
}
La meilleure façon de le comprendre est d'aller vérifier les sources de DiagnosticActorLogging:
/**
* Scala API: Mix in DiagnosticActorLogging into your Actor to easily obtain a reference to a logger with MDC support,
* which is available under the name "log".
* In the example bellow "the one who knocks" will be available under the key "iam" for using it in the logback pattern.
*
* {{{
* class MyActor extends Actor with DiagnosticActorLogging {
*
* override def mdc(currentMessage: Any): MDC = {
* Map("iam", "the one who knocks")
* }
*
* def receive = {
* case "pigdog" => log.info("We've got yet another pigdog on our hands")
* }
* }
* }}}
*/
trait DiagnosticActorLogging extends Actor {
import akka.event.Logging._
val log = akka.event.Logging(this)
def mdc(currentMessage: Any): MDC = emptyMDC
override protected[akka] def aroundReceive(receive: Actor.Receive, msg: Any): Unit = try {
log.mdc(mdc(msg))
super.aroundReceive(receive, msg)
} finally {
log.clearMDC()
}
}
Fondamentalement, il permet d'associer implicitement quelques morceaux partagés de données de journalisation à chaque appel de l'exploitation forestière dans l'acteur sans tous les échos de en les ajoutant explicitement. Selon votre application, cela peut être utile pour des choses comme le nom d'hôte, l'ID de demande, l'ID du client, la version jar, la date de construction, le point de terminaison, etc ...