我有一个Akka Actor,它调用了MyObject.foo()。MyObject不是Actor。我该如何在其中设置Logging?使用Actor很简单,因为我只需混合ActorLogging即可。在MyObject中,我无法访问context.system。我应该用AkkaSystem()创建一个akka.event.Logging,然后对LogSource隐式执行什么操作?
MyObject.foo()
MyObject
akka.event.Logging
dxpyg8gm1#
实际上,我会将Akka日志重定向到slf4j,并在所有不相关的类中直接使用此API。
akka { event-handlers = ["akka.event.slf4j.Slf4jEventHandler"] loglevel = "DEBUG" }
然后选择一些SLF 4J实现,我建议logback.在你的演员继续使用ActorLogging特质.在其他类中简单地依赖SLF 4J API -甚至更好-尝试围绕SLF 4J的slf4s外观。提示:在Logback中尝试以下日志记录模式:
ActorLogging
<pattern>%d{HH:mm:ss.SSS} | %-5level | %thread | %X{akkaSource} | %logger{1} | %m%n%rEx</pattern>
%X{akkaSource}将在可用时打印actor路径(就像标准日志一样)。
%X{akkaSource}
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!")
这似乎是统一应用程序日志记录的一个更简单的解决方案。
qnzebej03#
如前所述,您已经为actor系统中的非actor日志记录选项所宠坏了,我将尝试提供一组启发式方法来帮助您确定应该如何路由工作日志记录。
*您可以在执行元和非执行元代码中直接使用记录器(log4j 1.x、logback、log4j 2.x)。
欢迎您根据需要混合和匹配上述行为以满足您的需求。例如,您可以选择绑定到SLF 4J作为库,并使用Akka日志记录其他所有内容。请注意,混合使用阻塞和非阻塞日志记录可能会导致争用情况,其中原因(通过参与者记录的异步)在其结果(直接记录的同步)之后记录。
dm7nw8vv4#
我现在决定通过DI构造函数注入(Guice)简单地传递我的中央日志记录系统。
this.log = akka.event.Logging.getLogger(actorSystem, this);
在类构造函数中。
3npbholx5#
根据latest (currently version 2.6.9) logging documentation,使用从org.slf4j.LoggerFactory获得的Logger是非常好的,并且实际上是推荐的在演员之外记录的方式。使用通过org.slf4j.LoggerFactory检索到的Logger是非常好的,但是这样日志事件将不包括akkaSource MDC值。当在参与者外部进行日志记录时,这是推荐的方式,包括从Future回调进行日志记录。我还提供了一个基于示例的片段
org.slf4j.LoggerFactory
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日志记录文档提供的配置。文档提供了更多信息,可以在这里找到
pbgvytdp6#
只需创建您自己记录器:
private val log = LoggerFactory.getLogger(YourClass.getClass)
6条答案
按热度按时间dxpyg8gm1#
实际上,我会将Akka日志重定向到slf4j,并在所有不相关的类中直接使用此API。
然后选择一些SLF 4J实现,我建议logback.在你的演员继续使用
ActorLogging
特质.在其他类中简单地依赖SLF 4J API -甚至更好-尝试围绕SLF 4J的slf4s外观。提示:在Logback中尝试以下日志记录模式:
%X{akkaSource}
将在可用时打印actor路径(就像标准日志一样)。ma8fv8wu2#
使用Akka 2.2.1,我可以将其放入我的应用程序中,以便在演员之外进行日志记录:
这似乎是统一应用程序日志记录的一个更简单的解决方案。
qnzebej03#
如前所述,您已经为actor系统中的非actor日志记录选项所宠坏了,我将尝试提供一组启发式方法来帮助您确定应该如何路由工作日志记录。
*您可以在执行元和非执行元代码中直接使用记录器(log4j 1.x、logback、log4j 2.x)。
*您可以将SLF 4J Facade用于执行元和非执行元日志记录。
*您可以使用Akka的Logging作为参与者和非参与者代码中的外观
欢迎您根据需要混合和匹配上述行为以满足您的需求。例如,您可以选择绑定到SLF 4J作为库,并使用Akka日志记录其他所有内容。请注意,混合使用阻塞和非阻塞日志记录可能会导致争用情况,其中原因(通过参与者记录的异步)在其结果(直接记录的同步)之后记录。
dm7nw8vv4#
我现在决定通过DI构造函数注入(Guice)简单地传递我的中央日志记录系统。
在类构造函数中。
3npbholx5#
根据latest (currently version 2.6.9) logging documentation,使用从
org.slf4j.LoggerFactory
获得的Logger是非常好的,并且实际上是推荐的在演员之外记录的方式。使用通过org.slf4j.LoggerFactory检索到的Logger是非常好的,但是这样日志事件将不包括akkaSource MDC值。当在参与者外部进行日志记录时,这是推荐的方式,包括从Future回调进行日志记录。
我还提供了一个基于示例的片段
为了最大限度地减少日志记录对性能的影响,可以为SLF4J后端配置异步附加器。建议使用Logback日志记录后端。
为生产配置logback.xml的起点:
日志记录通常意味着IO和锁,如果同步执行,则会降低代码的操作速度。
上面显示的配置是AKKA日志记录文档提供的配置。文档提供了更多信息,可以在这里找到
pbgvytdp6#
只需创建您自己记录器: