阿卡在演员外面login

我有一个Akka Actor来调用MyObject.foo()。 MyObject不是一个Actor。 我如何设置login? 与一个演员很简单,因为我可以混入ActorLogging。 在MyObject中,我无法访问context.system。 我是否使用AkkaSystem()创buildakka.event.Logging,然后LogSource是隐式的?

其实我会redirect阿卡logging到slf4j和直接使用这个API在所有不相关的类。 首先将其添加到您的configuration中:

akka { event-handlers = ["akka.event.slf4j.Slf4jEventHandler"] loglevel = "DEBUG" } 

然后select一些SLF4J实现,我build议使用logback 。 在你的演员继续使用ActorLogging特质。 在其他类中,只需依赖SLF4J API(甚至更好),就可以在SLF4J周围试用slf4s外观。

提示:在Logback中尝试以下日志logging模式:

 <pattern>%d{HH:mm:ss.SSS} | %-5level | %thread | %X{akkaSource} | %logger{1} | %m%n%rEx</pattern> 

%X{akkaSource}将在可用时打印actorpath(就像标准日志logging一样)。

使用Akka 2.2.1,我能够把它放到我的应用程序中,以便在一名演员之外login:

 import akka.event.Logging val system = ActorSystem("HelloSystem", ConfigFactory.load.getConfig("akka")) val log = Logging.getLogger(system, this) log.info("Hi!") 

这似乎是统一应用程序日志logging的一个更简单的解决scheme。

我现在已经决定通过DI构造器注入(Guice)简单地传递我的中央日志logging系统。 而在我的class级,经常进行日志logging(其中asynchronous是重要的),我把注入的ActorSystem和调用

 this.log = akka.event.Logging.getLogger(actorSystem, this); 

在类的构造函数中。

正如已经提到的,你被宠坏了在actor系统中的非actor操作的选项。 我将尝试提供一套启发式方法来帮助您确定如何为您的工作路由日志logging。

  1. 您可以直接在angular色代码和非angular色代码中使用logging器(log4j 1.x,logback,log4j 2.x)。
    • 这将您的代码紧密结合到logging器实现中。 这是好的,如果它是你的代码,不要在其他地方使用,但不好,如果你正在build立一个图书馆或打算开源你的工作。
    • 如果你这样做,你从演员系统中获益不大。 logging呼叫可能会成为阻塞呼叫,具体取决于您如何设置logging器,因此无论性能还是背压控制都是重要的考虑因素,这种情况都会受到影响。
    • 因为angular色代码(以及它可以使用的服务)可以在许多不同的线程上运行,所以一些传统的日志logging活动(例如使用线程本地MDC(Mapped Diagnostic Context))可能导致离奇的竞争条件和上下文切换,从演员传到演员。 诸如在发送消息之前将MDC交换到消息之类的活动对于保持参与者和非参与者之间的上下文代码是必要的。
    • 要捕获ActorSystem事件(如死信和监督),您可能需要编写一个日志logging适配器,并在application.conf中指定它。 这些非常简单。
  2. 您可以将SLF4J外观用于actor和non-actor日志。
    • 你不再与logging器impl耦合,而且你的服务还没有被耦合到akka。 这是可移植性的最佳select。
    • 您可以从您的日志框架inheritance阻止行为。
    • 您可能需要pipe理MDC
    • 要捕获ActorSystem事件,您需要在application.conf中指定“akka.event.slf4j.Slf4jLogger”
    • 您需要在类path中包含一个slf4j提供程序jar来将slf4j日志事件路由到您select的logging器
  3. 您可以在Actor和非Actor的代码中使用Akka的Logging作为您的外观
    • 你没有被耦合到一个logging器或者slf4j,但是你被耦合到一个akka版本。 无论如何,这可能是您系统的一个要求,但对于图书馆来说,这可能会降低可移植性。
    • 你必须绕过一个演员系统来充当logging器的“公共汽车”。 紧密耦合到工作angular色系统会进一步降低可移植性。 (在一个应用程序中,我通常使用隐式或全局ActorSystem构build一个LoggingViaActorSystem特征,这使得在代码中处理这个变得更容易,但是不会跨越依赖关系)。
    • 即使您的logging器不支持它们,也可以保证非阻塞asynchronouslogging。 logging的因果一致性可能是由于使用单个消费者邮箱。 但是,记忆安全和背压是不是(我相信阿卡伐木使用无限的邮箱) –
    • 有些选项可以使用DiagnosticLoggingAdapter来避免pipe理自己的MDC的复杂性,因为工作从actor到actor的传递。 即使非angular色代码改变这些MDC,也应该保持一致性。
    • 在内存不足崩溃期间,日志logging可能不可用,并且对默认调度程序中的线程饥饿敏感
    • 您需要在application.conf中指定您select的logging器,除非您有兴趣logging到标准输出

欢迎您根据需要混合和匹配上述行为以满足您的要求。 例如,你可以select绑定到SLF4J的库,并使用阿卡日志logging的一切。 只要注意混合阻塞和非阻塞日志logging可能会导致竞争条件的原因(loggingasynchronous通过演员)后,他们的影响(直接logging同步)logging。