2013-03-06 2 views
17

Abbiamo avuto difficoltà a rilevare e analizzare gli errori nei nostri attori Akka all'interno di un'applicazione Play 2.0.4.Come registrare le eccezioni non rilevate negli attori Akka?

come si arriva tutti non gestite fanno eccezioni nelle attori Akka per aver effettuato il login con stacktraces utili?

La migliore che siamo stati in grado di fare finora è quello di aggiungere quanto segue al 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 
     } 
    } 
} 

Tuttavia, data la seguente attore:

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

tutto ciò che vediamo sempre loggati is:

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

Qualcuno può aiutarci a ottenere stacktrace informativi in ​​tutto il medici, quando c'è un'eccezione non catturata?

Grazie.

+0

Strano. Dovrebbe registrare tutte le eccezioni per impostazione predefinita. – sourcedelica

+0

Controllare la configurazione del logger (log4j/logback/etc). Akka registrerà le eccezioni al livello ERROR con lo stack trace. – sourcedelica

+0

Si stanno utilizzando le impostazioni di configurazione corrispondenti a 2.2-M1 o master, corrisponde ai propri JAR? –

risposta

0

Quando si utilizza il logger slf4j, la configurazione di registrazione di Akka non viene più utilizzata. A seconda del quadro di registrazione e la configurazione, potrebbe essere necessario:

  • cambiamento logback.xml, logback.groovy o logback-test.xml
  • cambiamento log4j.xml o log4j.properties
  • aggiungere un logback o log4j jar sul tuo classpath

In genere quando il sistema gira, vengono stampati alcuni dettagli sul framework di registrazione (in particolare se è configurato in modo errato). Potrebbero esserci molte cause, ma molto probabilmente stai cercando nel file di configurazione sbagliato.

7

Se non riesci a trovare fuori dalla manipolazione in Akka scatola, quindi è possibile creare un semplice tratto di mescolare nei vostri attori in questo modo:

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

pre-riavvio verrà chiamato quando un'eccezione non rilevata si è verificato e l'attore sta per essere riavviato. Sembra un buon posto per collegarti alla tua registrazione più dettagliata. Come bonus, il messaggio ricevuto che ha causato l'errore è disponibile per il contesto aggiuntivo all'interno del registro.

si potrebbe anche refactoring di questo codice un po 'per impostare il tratto a essere impilabile nel caso in cui si dispone di altri attori che sono stati già imperativi preRestart

+1

Probabilmente vorrai aggiungere una chiamata a super.preRestart (motivo, messaggio), altrimenti il ​​tuo metodo postStop dell'Actor non verrà chiamato. – user2089674

+0

@ user2089674, buon punto. Ho aggiornato la risposta di conseguenza – cmbaxter

+5

Il tratto non viene compilato. Il compilatore dice che non è possibile chiamare super.preRestart. – Vistritium