Подтвердить что ты не робот

Как регистрировать исключения в аккских актерах?

У нас было трудное время для обнаружения и расследования ошибок в наших акковых акках в приложении Play 2.0.4.

Как получить все неперехваченные исключения в актерах Akka для регистрации с помощью полезных стеков стека?

Самое лучшее, что нам удалось сделать до сих пор, - добавить к application.conf следующее:

logger.akka=DEBUG

akka {
    loglevel = DEBUG
    stdout-loglevel = DEBUG
    loggers = ["akka.event.slf4j.Slf4jLogger"]
    actor {
        debug {
            receive = on
            autoreceive = on
            fsm = on
            lifecycle = on
            unhandled = on
            event-stream = on
            router-misconfiguration = on
        }
    }
}

Однако, учитывая следующий актер:

class ThrowingActor{
  def receive = {
    case _ => {
      throw new Exception("--------------ASDFASDFASDFASDFASDFASDFASDF------------------")
    }
  }
}

Все, что мы видим, регистрируется:

[DEBUG] [03/06/2013 16:15:44.311] [application-akka.actor.default-dispatcher-16] [Future] --------------ASDFASDFASDFASDFASDFASDFASDF------------------

Может ли кто-нибудь помочь нам получить информативные элементы stacktraces во всех наших актерах, когда есть неперехваченное исключение?

Спасибо.

4b9b3361

Ответ 1

Если вы не можете узнать из окна обработки в Akka, то вы можете создать простую черту, чтобы смешать с вашими актерами так:

import akka.actor._

trait UnhandledExceptionLogging{
  self: Actor with ActorLogging =>

  override def preRestart(reason:Throwable, message:Option[Any]){
    super.preRestart(reason, message)
    log.error(reason, "Unhandled exception for message: {}", message)
  }
}

class MyActor extends Actor with ActorLogging with UnhandledExceptionLogging{
  def receive = {
    case _ =>
      throw new Exception("blah blah")
  }
}

Предварительный перезапуск будет вызываться, когда произошло неперехваченное исключение, и актер перезапускается. Кажется, это хорошее место, чтобы подключиться к вашему собственному более подробному протоколированию. В качестве бонуса полученное сообщение, вызвавшее отказ, доступно для дополнительного контекста в журнале.

Вы также можете реорганизовать этот код немного, чтобы настроить черту, которая будет стекироваться, если у вас есть другие актеры, которые уже переопределяют preRestart

Ответ 2

Когда вы используете логгер slf4j, регистрационная конфигурация Akka больше не используется. В зависимости от структуры ведения журнала и настройки вам может потребоваться:

  • изменить logback.xml, logback.groovy или logback-test.xml
  • изменить log4j.xml или log4j.properties
  • добавить логин или log4j jar в свой путь к классам

Обычно, когда система закручивается, он печатает некоторые сведения о структуре ведения журнала (особенно, если она неверно сконфигурирована). Может быть много причин, но вы, скорее всего, смотрите в неправильный файл конфигурации.