Akka Scheduler重置记录器级别。为什么?

时间:2013-11-25 09:45:24

标签: scala logging playframework-2.0 akka logback

Global.scala在一个新的Play2应用程序中:

import play.api.{GlobalSettings, Application}
import play.api.libs.concurrent.Akka
import play.api.libs.concurrent.Execution.Implicits._
import play.api.Play
import play.api.Play.current
import scala.concurrent._
import scala.concurrent.duration._
import play.api.Logger

object Global extends GlobalSettings {
  val logger = Logger("foo")

  // `printLoggerLevels` prints logger levels
  def printLoggerLevels(prepend:String) =
    logger.error(
      prepend +": "+
      logger.isErrorEnabled +" "+
      logger.isWarnEnabled +" "+
      logger.isInfoEnabled +" "+
      logger.isDebugEnabled +" "+
      logger.isTraceEnabled
    )

  override def onStart(app: Application) {
    printLoggerLevels("outside scheduleOnce")
    Akka.system.scheduler.scheduleOnce(500 milliseconds) {
      printLoggerLevels("inside scheduleOnce")
    } 
  } 
} 

这会在Akka.system.scheduler.scheduleOnce(500 milliseconds) {...}之外和之内打印记录器级别,如下所示:

$ play start 9000
[error] foo - outside scheduleOnce: true true true true false <----- notice this
[info] play - Starting application default Akka system.
[info] a.e.s.Slf4jEventHandler - Slf4jEventHandler started
[info] play - Application started (Prod)
[info] play - Listening for HTTP on /0:0:0:0:0:0:0:0:9000
[error] foo - inside scheduleOnce: true false false false false  <----- and this

上面你可以看到,scheduleOnce内的记录器级别被重置为ERROR。在scheduleOnce之外,他们在DEBUG上,在里面他们在ERROR上。如果我使用play run运行它会运行正常,并且级别会相同,但是当从play start开始时,它们会被重置。

Application.conf:

logger.root=DEBUG
logger.play=INFO
logger.application=INFO

这是一个新项目,我没有做任何改变,我没有发布。

为什么会这样?

编辑:提出这个问题的另一种方法是:运行带有start的应用程序如何影响它的内部工作,反过来,这会如何影响传递给Akka调度程序的匿名函数中的日志记录级别?

编辑:播放版本为2.1.4

1 个答案:

答案 0 :(得分:1)

说实话,这有点乱。它在Play 2.2.x中有所改进,但它仍然很混乱。

运行和启动之间的最大区别在于,在运行时,Netty服务器在应用程序加载之前启动(因为它在您第一次点击netty服务器之前不加载应用程序,因为它是动态的)。首先,netty服务器在加载应用程序后启动,因为在您拥有可以为其提供服务的应用程序之前,您不希望开始提供请求。启动netty服务器时,记录器已配置。