2013-03-06 9 views
17

Biz zor bir zaman tespit ve Play 2.0.4 uygulama içinde bizim Akka aktörler hataları araştıran yaşıyorum.Akka aktörlerinde yakalanmamış istisnalar nasıl kaydedilir?

Akka aktörlerinde yakalanan istisnaların tümü 'u nasıl yakalar?

biz bugüne kadar bunu başardık iyi eklemektir aşağıdaki application.conf için: Aşağıdaki aktör verilen Ancak

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

:

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

Tüm geçerli:

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

kimse bize tüm a genelinde bilgilendirici stacktraces almama yardım eder misin yakalanmamış bir istisna olduğunda, ctors?

Teşekkürler.

+0

Strange geçersiz kılma edilen diğer aktörler var bu kod halinde istiflenebilir olması özelliğini kurmak için biraz planı ayrı olabilir. Tüm istisnaları varsayılan olarak kaydetmelidir. – sourcedelica

+0

Kaydedicinizi (log4j/logback/etc) yapılandırmanızı kontrol edin. Akka, istisnaları ERROR seviyesinde yığın iziyle kaydeder. – sourcedelica

+0

2.2-M1 veya master'a karşılık gelen yapılandırma ayarlarını kullanıyorsunuz, bu JAR'larınıza karşılık geliyor mu? –

cevap

0

Eğer Akka günlüğü yapılandırma artık kullanılmamaktadır slf4j logger kullandığınızda. Bir logback eklemek

  • değişim logback.xml, logback.groovy veya logback-test.xml
  • değişiklik log4j.xml veya log4j.properties
  • : Eğer günlük tutma çerçevesi ve kurulum bağlı olarak, gerekebilir veya sınıf yolunuzda log4j kavanozu

Genellikle sistem döndüğünde, günlük çerçevesiyle ilgili bazı ayrıntıları (özellikle yanlış yapılandırılmışsa) yazdırır. Birçok neden olabilir, ancak büyük olasılıkla yanlış yapılandırma dosyasına bakıyorsunuz.

7

Eğer Akka'da taşıma kutunun dışında bulamazsanız, o zaman bu kadar sevdiği oyuncularla da karıştırmak için basit özellik oluşturabilirsiniz:

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

Öncesi yeniden başlatma zaman yakalanmamış istisna adı verilecek oldu ve aktör yeniden başlatılacak. Kendi daha ayrıntılı günlüğe kaydetmeniz için iyi bir yer gibi gözüküyor. Bir bonus olarak, başarısızlığa neden olan alınan mesaj, günlük içinde ek içerik için kullanılabilir.

Ayrıca zaten preRestart

+1

Muhtemelen başka super.preRestart için bir çağrı (sebebi, mesajı) eklemek istediğiniz veya bütçenin yanı Aktörler postStop yöntemi denir edilmeyecektir. – user2089674

+0

@ user2089674, iyi nokta. Yanıtı buna göre güncelledim – cmbaxter

+5

Özellik derlenmiyor. Derleyici, super.preRestart'ın çağrılmayacağını söylüyor. – Vistritium