所以我有一个包含以下子模块的播放应用程序:
/app // play app
/modules/notifications
在我的游戏应用中,我有一个任务模块,用于启动我的主要演员:
Logger.debug("starting main supervisor actor Iot")
val supervisor = system.actorOf(IotSupervisor.props(), "iot-supervisor")
在通知中,我有此文件:
/modules/notifications/src/main/supervisor.scala
package com.example.notifications
import akka.actor.{ Actor, ActorLogging, Props }
object IotSupervisor {
def props(): Props = Props(new IotSupervisor)
}
class IotSupervisor extends Actor with ActorLogging {
log.debug("Iot constrcutor called..")
override def preStart(): Unit = log.info("IoT Application started")
override def postStop(): Unit = log.info("IoT Application stopped")
// No need to handle any messages
override def receive = Actor.emptyBehavior
}
我可以在控制台中看到日志:
[debug]应用程序-启动主要主管演员Iot [info] p.a.h.EnabledFilters-启用的过滤器(请参阅 https://www.playframework.com/documentation/latest/Filters):
play.filters.csrf.CSRFFilter play.filters.headers.SecurityHeadersFilter
[info] play.api.Play-应用已启动(Dev)
我的logback.xml如下:
<!-- https://www.playframework.com/documentation/latest/SettingsLogger -->
<configuration>
<conversionRule conversionWord="coloredLevel" converterClass="play.api.libs.logback.ColoredLevel" />
<!--<appender name="FILE" class="ch.qos.logback.core.FileAppender">-->
<!--<file>${application.home:-.}/logs/application.log</file>-->
<!--<encoder>-->
<!--<pattern>%date [%level] from %logger in %thread - %message%n%xException</pattern>-->
<!--</encoder>-->
<!--</appender>-->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%coloredLevel %logger{15} - %message%n%xException{10}</pattern>
</encoder>
</appender>
<!--<appender name="ASYNCFILE" class="ch.qos.logback.classic.AsyncAppender">-->
<!--<appender-ref ref="FILE" />-->
<!--</appender>-->
<appender name="ASYNCSTDOUT" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="STDOUT" />
</appender>
<logger name="play" level="INFO" />
<logger name="application" level="DEBUG" />
<logger name="com.example.notifications" LEVEL="TRACE" />
<!-- Off these ones as they are annoying, and anyway we manage configuration ourselves -->
<logger name="com.avaje.ebean.config.PropertyMapLoader" level="OFF" />
<logger name="com.avaje.ebeaninternal.server.core.XmlConfigLoader" level="OFF" />
<logger name="com.avaje.ebeaninternal.server.lib.BackgroundThread" level="OFF" />
<logger name="com.gargoylesoftware.htmlunit.javascript" level="OFF" />
<root level="WARN">
<!--<appender-ref ref="ASYNCFILE" />-->
<appender-ref ref="ASYNCSTDOUT" />
</root>
</configuration>
除非使用 log.error ,否则我的演员内部都看不到任何日志消息,为什么?
我将com.example.notifications的级别设置为TRACE
我的理解是否正确,每当我使用记录器时,它将使用在logback中定义的与程序包名称匹配的记录器?即com.example.notification将用于在我的logback.xml中查找记录器并使用在那里定义的LEVEL?
答案 0 :(得分:2)
您需要阅读本documentation,以了解如何在slf4j
中启用akka
。
总而言之,
添加到build.sbt
libraryDependencies ++= Seq(
"com.typesafe.akka" %% "akka-slf4j" % "2.5.19",
"ch.qos.logback" % "logback-classic" % "1.2.3"
)
添加到application.conf
akka {
loggers = ["akka.event.slf4j.Slf4jLogger"]
loglevel = "DEBUG"
logging-filter = "akka.event.slf4j.Slf4jLoggingFilter"
}
您需要在以下位置的loggers元素中启用Slf4jLogger 组态。在这里您还可以定义事件的日志级别 总线。可以在配置中定义更细粒度的日志级别 SLF4J后端的版本(例如logback.xml)。您还应该定义 日志记录过滤器中的akka.event.slf4j.Slf4jLoggingFilter 配置属性。它将使用 后端配置(例如logback.xml),然后再发布到 事件总线。
答案 1 :(得分:1)
确保您的项目依赖于"com.typesafe.akka" %% "akka-slf4j"
和"ch.qos.logback" % "logback-classic"
。否则,akka可能会使用Logback以外的其他记录器功能。
如果那不能解决您的问题,请尝试明确使用ActorSystem的记录器:
system.log.debug("starting main supervisor actor Iot")