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
答案 0 :(得分:1)
说实话,这有点乱。它在Play 2.2.x中有所改进,但它仍然很混乱。
运行和启动之间的最大区别在于,在运行时,Netty服务器在应用程序加载之前启动(因为它在您第一次点击netty服务器之前不加载应用程序,因为它是动态的)。首先,netty服务器在加载应用程序后启动,因为在您拥有可以为其提供服务的应用程序之前,您不希望开始提供请求。启动netty服务器时,记录器已配置。