Когда следует использовать DiagnosticActorLogging вместо черт ActorLogging в Akka?
В чем разница между ActorLogging
а также DiagnosticActorLogging
черты в Akka
и когда вы должны отдать предпочтение одному над другим? Быстрый просмотр документов не дает большого руководства.
2 ответа
MDC позволяет добавлять дополнительный контекст к сообщениям, которые вы регистрируете. Например, с шаблоном регистрации %5p %X{user-id} %m%n
, вставив user-id
в mdc map подставим значение в поле шаблона %X{user-id}
DiagnosticActorLogging
предоставляет вам легкий доступ к mdc
и заботится о настройке и очистке mdc для каждого сообщения, обрабатываемого субъектом. Взгляни на aroundReceive
метод в DiagnosticActorLogging
черта, чтобы понять это лучше
override protected[akka] def aroundReceive(receive: Actor.Receive, msg: Any): Unit = try {
log.mdc(mdc(msg))
super.aroundReceive(receive, msg)
} finally {
log.clearMDC()
}
Самый простой способ понять это - проверить источники 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()
}
}
По сути, это позволяет неявно связывать некоторые общие части данных регистрации с каждым вызовом записи в актере без всякой путаницы, добавляя их явно. В зависимости от вашего приложения, это может быть полезно для таких вещей, как имя хоста, идентификатор запроса, идентификатор клиента, версия JAR, дата сборки, конечная точка и т. Д.