2013-03-06 3 views
17

Nous avons eu du mal à détecter et à étudier les erreurs de nos acteurs Akka dans une application Play 2.0.4.Comment enregistrer les exceptions non interceptées dans les acteurs Akka?

Comment obtient-on tous les exceptions non interceptées dans les acteurs Akka pour être connecté avec des stacktraces utiles?

Le mieux que nous avons pu faire est jusqu'ici d'ajouter ce qui suit à 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 
     } 
    } 
} 

Cependant, compte tenu de l'acteur suivant:

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

Tout ce que nous voyons se LOGGED est:

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

Quelqu'un peut-il nous aider à obtenir des empilements informatifs sur tous nos cteurs, quand il y a une exception non saisie?

Merci.

+0

étrange. Il devrait enregistrer toutes les exceptions par défaut. – sourcedelica

+0

Vérifiez la configuration de votre logger (log4j/logback/etc). Akka consignera les exceptions au niveau ERREUR avec la trace de la pile. – sourcedelica

+0

Vous utilisez les paramètres de configuration correspondant à 2.2-M1 ou maître, est-ce que cela correspond à vos fichiers JAR? –

Répondre

0

Lorsque vous utilisez le consignateur slf4j, la configuration de journalisation d'Akka n'est plus utilisée. En fonction de votre structure de journalisation et la configuration, vous pourriez avoir à:

  • changement logback.xml, logback.groovy ou logback-test.xml
  • changement log4j.xml ou log4j.properties
  • ajouter un logback ou jar log4j sur votre chemin de classe

Habituellement, lorsque le système tourne, il affiche quelques détails sur le cadre de journalisation (en particulier s'il est mal configuré). Il peut y avoir plusieurs causes, mais vous cherchez probablement dans le mauvais fichier de configuration.

7

Si vous ne trouvez pas de la boîte de manutention à Akka, vous pouvez créer un trait simple à mélanger dans vos acteurs comme ceci:

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") 
    } 
} 

pré-redémarrage sera appelée lorsqu'une exception uncaught a eu lieu et l'acteur est sur le point d'être redémarré. On dirait un bon endroit pour accrocher dans votre propre journal plus détaillé. En prime, le message reçu qui a provoqué l'échec est disponible pour un contexte supplémentaire dans le journal.

Vous pouvez également factoriser ce code un peu pour mettre en place le trait d'être empilable au cas où vous avez d'autres acteurs qui étaient dominantes déjà preRestart

+1

Vous voudrez probablement ajouter un appel à super.preRestart (raison, message), sinon la méthode postStop de votre acteur ne sera pas appelée. – user2089674

+0

@ user2089674, bon point. J'ai mis à jour la réponse en conséquence – cmbaxter

+5

Le trait ne compile pas. Le compilateur dit que super.preRestart ne peut pas être appelé. – Vistritium

Questions connexes