我有一个打电话给MyObject.foo()
的Akka演员。 MyObject
不是演员。如何设置登录?使用Actor很简单,因为我可以混合使用ActorLogging。在MyObject中,我无权访问context.system。我是否使用AkkaSystem()创建akka.event.Logging
,然后隐含LogSource的内容?
答案 0 :(得分:25)
实际上我会将Akka日志记录重定向到slf4j,并在所有不相关的类中直接使用此API。首先将其添加到您的配置中:
akka {
event-handlers = ["akka.event.slf4j.Slf4jEventHandler"]
loglevel = "DEBUG"
}
然后选择一些SLF4J实现,我建议logback。在你的演员中继续使用ActorLogging
特质。在其他类中,只需依赖SLF4J API - 甚至更好 - 在SLF4J周围试用slf4s外观。
提示:在Logback中尝试以下日志记录模式:
<pattern>%d{HH:mm:ss.SSS} | %-5level | %thread | %X{akkaSource} | %logger{1} | %m%n%rEx</pattern>
%X{akkaSource}
将在可用时打印actor路径(就像标准日志记录一样)。
答案 1 :(得分:21)
使用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!")
这似乎是统一应用程序日志记录的简单解决方案。
答案 2 :(得分:9)
正如已经提到的,你在演员系统中为非演员日志记录的选项而被宠坏了。我将尝试提供一组启发式方法来帮助您确定如何为您的工作路由日志。
欢迎您根据需要混合搭配上述行为,以满足您的要求。例如,您可以选择绑定到SLF4J以用于库,并将Akka日志记录用于其他所有内容。请注意,混合阻塞和非阻塞日志记录可能会导致竞争条件,其原因(通过actor记录的异步)在其效果后记录(直接记录同步)。
答案 3 :(得分:8)
我现在已经决定通过DI构造函数注入(Guice)简单地传递我的中央日志系统。在我定期记录的类中(异步性非常重要),我将注入的ActorSystem调用
this.log = akka.event.Logging.getLogger(actorSystem, this);
在类构造函数中。
答案 4 :(得分:1)
根据latest (currently version 2.6.9) logging documentation,使用从org.slf4j.LoggerFactory
获得的记录器非常好,实际上,这是推荐的登录参与者外部的方法。我在此复制准确的措辞。
使用通过以下方式检索到的记录器是完全可以的 org.slf4j.LoggerFactory,但随后的日志记录事件将不包括 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日志记录文档提供的配置。该文档提供了更多信息,可以在here
中找到答案 5 :(得分:0)
只需创建您自己的记录器:
private val log = LoggerFactory.getLogger(YourClass.getClass)