18

Play 2.0.4 アプリケーション内の Akka アクターのエラーを検出して調査するのに苦労しています。

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

キャッチされていない例外がある場合、すべてのアクターにわたって有益なスタックトレースを取得するのを手伝ってくれる人はいますか?

ありがとう。

4

2 に答える 2

7

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

于 2013-04-23T18:53:23.790 に答える
0

slf4j ロガーを使用すると、Akka のロギング構成は使用されなくなります。ロギング フレームワークと設定によっては、次の操作が必要になる場合があります。

  • logback.xml、logback.groovy、または logback-test.xml を変更します
  • log4j.xml または log4j.properties を変更します
  • クラスパスにlogbackまたはlog4j jarを追加します

通常、システムが起動すると、ロギング フレームワークに関する詳細が表示されます (特に設定が間違っている場合)。多くの原因が考えられますが、間違った構成ファイルを探している可能性が非常に高いです。

于 2013-03-12T10:41:36.060 に答える