MyObject.foo()
を呼び出すAkkaアクターがあります。 MyObject
はアクターではありません。どのようにログを設定するのですか? ActorLoggingをミックスインできるので、Actorを使用すると簡単です。 MyObjectでは、context.systemにアクセスできません。 AkkaSystem()を使用してakka.event.Logging
を作成してから、LogSourceを暗黙的に作成しますか?
実際、私はAkkaのログを slf4j にリダイレクトし、このAPIを関連のないすべてのクラスで直接使用します。まず、これを構成に追加します。
akka {
event-handlers = ["akka.event.slf4j.Slf4jEventHandler"]
loglevel = "DEBUG"
}
次に、いくつかのSLF4J実装を選択します。 logback をお勧めします。あなたのアクターではActorLogging
トレイトを使い続けます。他のクラスでは、単にSLF4J APIに依存している-またはさらに優れている-SLF4Jの周りの slf4s facadeを試してみてください。
ヒント:Logbackで次のロギングパターンを試してください。
<pattern>%d{HH:mm:ss.SSS} | %-5level | %thread | %X{akkaSource} | %logger{1} | %m%n%rEx</pattern>
%X{akkaSource}
は、(標準のロギングと同様に)使用可能な場合にアクターパスを出力します。
Akka 2.2.1を使用して、これを自分のアプリに入れて、俳優の外でログを取得することができました。
import akka.event.Logging
val system = ActorSystem("HelloSystem", ConfigFactory.load.getConfig("akka"))
val log = Logging.getLogger(system, this)
log.info("Hi!")
これは、アプリケーションのロギングを統合するためのより簡単なソリューションのようです。
すでに述べたように、アクターシステム内での非アクターロギングのオプションは台無しになっています。作業のログをどのようにルーティングする必要があるかを判断するのに役立つ一連のヒューリスティックを提供しようと試みます。
要件を満たすために、必要に応じて上記の動作を組み合わせることもできます。たとえば、ライブラリのSLF4Jにバインドし、他のすべてにAkkaロギングを使用することを選択できます。ブロッキングとノンブロッキングのログを混在させると、原因(アクター経由でログに記録された非同期)が影響(ログに直接記録された同期)の後にログに記録される競合状態が発生する可能性があることに注意してください。
これで、DIコンストラクターインジェクション(Guice)を介して中央のログシステムを渡すだけで解決しました。そして、定期的にロギングを行うクラス(非同期性が重要な場合)では、注入されたActorSystemを取得して、
this.log = akka.event.Logging.getLogger(actorSystem, this);
クラスのコンストラクタで。
独自のロガーを作成するだけです。
private val log = LoggerFactory.getLogger(YourClass.getClass)