为什么我看不到演员的日志消息(错误级别除外)

时间:2019-01-01 15:31:46

标签: scala logging akka

所以我有一个包含以下子模块的播放应用程序:

/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?

2 个答案:

答案 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")