Когда следует использовать 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, дата сборки, конечная точка и т. Д.

Другие вопросы по тегам