Akka记录外部演员

vx6bjr1n  于 2022-11-06  发布在  其他
关注(0)|答案(6)|浏览(145)

我有一个Akka Actor,它调用了MyObject.foo()MyObject不是Actor。我该如何在其中设置Logging?使用Actor很简单,因为我只需混合ActorLogging即可。在MyObject中,我无法访问context.system。我应该用AkkaSystem()创建一个akka.event.Logging,然后对LogSource隐式执行什么操作?

dxpyg8gm

dxpyg8gm1#

实际上,我会将Akka日志重定向到slf4j,并在所有不相关的类中直接使用此API。

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

然后选择一些SLF 4J实现,我建议logback.在你的演员继续使用ActorLogging特质.在其他类中简单地依赖SLF 4J API -甚至更好-尝试围绕SLF 4J的slf4s外观。
提示:在Logback中尝试以下日志记录模式:

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

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

ma8fv8wu

ma8fv8wu2#

使用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!")

这似乎是统一应用程序日志记录的一个更简单的解决方案。

qnzebej0

qnzebej03#

如前所述,您已经为actor系统中的非actor日志记录选项所宠坏了,我将尝试提供一组启发式方法来帮助您确定应该如何路由工作日志记录。

*您可以在执行元和非执行元代码中直接使用记录器(log4j 1.x、logback、log4j 2.x)。

  • 这会将你的代码与一个日志实现紧密耦合起来。如果这是你的代码,不被其他地方使用,这是很好的,但是如果你正在构建一个库或者打算开源你的工作,这就不好了。
  • 如果您这样做,您将无法从actor系统中获得任何好处。日志调用可能会变成阻塞调用,这取决于您如何设置日志程序,因此,在性能或对背压的控制是重要关注点的情况下,这是不可取的。
  • 因为演员代码(沿着它可以使用的服务)可以在许多不同的线程上操作,一些传统的日志记录活动,如使用线程本地MDC(Map的诊断上下文)可能会导致奇怪的争用条件和上下文切换,其中日志输出来自在执行元之间传递的消息。在发送消息之前将MDC交换到消息上这样的活动对于保留参与者和非参与者代码之间的上下文可能是必要的。
  • 要捕获ActorSystem事件(如死信和监督),您可能需要编写一个日志适配器并在application. conf中指定它。这些操作非常简单。
    *您可以将SLF 4J Facade用于执行元和非执行元日志记录。
  • 你不再与logger impl耦合,而且你的服务也不再与akka耦合,这是最好的可移植性选择。
  • 您可以从日志框架继承阻止行为。
  • 您可能需要管理MDC
  • 要捕获ActorSystem事件,您需要在应用程序.conf中指定“akka.event.slf4j.Slf4jLogger”
  • 您需要在类路径中包含一个slf 4j提供程序jar,以便将slf 4j日志事件路由到您选择的记录器
    *您可以使用Akka的Logging作为参与者和非参与者代码中的外观
  • 你没有耦合到logger impl或者slf 4j,但是你耦合到了akka的一个版本。这可能是你的系统的一个要求,但是对于库来说,它可能会降低可移植性。
  • 您必须传递一个actor系统来充当记录器的“总线”。与工作actor系统的紧密耦合进一步降低了可移植性。(在应用程序中,我通常构建一个带有隐式或全局ActorSystem的小LoggingViaActorSystem特性,这使得在代码中处理这一点更容易,而不是跨依赖项处理)。
  • 非阻塞异步日志记录是有保证的,即使你的日志记录器不支持它们。日志记录的因果一致性可能是由于使用了单个消费者邮箱。然而,内存安全和背压不是(我相信Akka日志记录使用了一个无界邮箱)--
  • 当工作从一个执行元传递到另一个执行元时,可以使用DiagnosticLoggingAdapter来避免管理您自己的MDC的复杂性。即使非执行元代码改变了这些MDC,也应该保持一致性。
  • 在内存不足崩溃期间,日志记录可能不可用,并且对默认调度程序上的线程饥饿很敏感
  • 您需要在application.conf中指定您选择的日志记录器,除非您对登录到标准输出感兴趣

欢迎您根据需要混合和匹配上述行为以满足您的需求。例如,您可以选择绑定到SLF 4J作为库,并使用Akka日志记录其他所有内容。请注意,混合使用阻塞和非阻塞日志记录可能会导致争用情况,其中原因(通过参与者记录的异步)在其结果(直接记录的同步)之后记录。

dm7nw8vv

dm7nw8vv4#

我现在决定通过DI构造函数注入(Guice)简单地传递我的中央日志记录系统。

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

在类构造函数中。

3npbholx

3npbholx5#

根据latest (currently version 2.6.9) logging documentation,使用从org.slf4j.LoggerFactory获得的Logger是非常好的,并且实际上是推荐的在演员之外记录的方式。
使用通过org.slf4j.LoggerFactory检索到的Logger是非常好的,但是这样日志事件将不包括akkaSource MDC值。当在参与者外部进行日志记录时,这是推荐的方式,包括从Future回调进行日志记录。
我还提供了一个基于示例的片段

val log = LoggerFactory.getLogger("com.mypackage.MyObject")

Future {
  // do something
  "result"
}.onComplete {
  case Success(result) => log.info("Success!: {}", result)
  case Failure(exc)    => log.error("Failure!", exc)
}

为了最大限度地减少日志记录对性能的影响,可以为SLF4J后端配置异步附加器。建议使用Logback日志记录后端。

dependencies {
  compile group: 'ch.qos.logback', name: 'logback-classic', version: '1.2.3'
}

为生产配置logback.xml的起点:

<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>myapp.log</file>
    <immediateFlush>false</immediateFlush>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>myapp_%d{yyyy-MM-dd}.log</fileNamePattern>
    </rollingPolicy>
    <encoder>
        <pattern>[%date{ISO8601}] [%level] [%logger] [%marker] [%thread] - %msg MDC: {%mdc}%n</pattern>
    </encoder>
</appender>

<appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
    <queueSize>8192</queueSize>
    <neverBlock>true</neverBlock>
    <appender-ref ref="FILE" />
</appender>

<root level="INFO">
    <appender-ref ref="ASYNC"/>
</root>

日志记录通常意味着IO和锁,如果同步执行,则会降低代码的操作速度。
上面显示的配置是AKKA日志记录文档提供的配置。文档提供了更多信息,可以在这里找到

pbgvytdp

pbgvytdp6#

只需创建您自己记录器:

private val log = LoggerFactory.getLogger(YourClass.getClass)

相关问题