Scala 如何声明对象';logger.xml中的记录器?
我需要对Play 2.1应用程序中的日志进行更细粒度的控制。为此,我在每个控制器中放置了一个独特的记录器,如下所示:Scala 如何声明对象';logger.xml中的记录器?,scala,playframework,logback,Scala,Playframework,Logback,我需要对Play 2.1应用程序中的日志进行更细粒度的控制。为此,我在每个控制器中放置了一个独特的记录器,如下所示: package controllers.admin object Accounts extends Controller { val log = LoggerFactory.getLogger(getClass()) def session = Action { implicit request => log.trace("session {}", req
package controllers.admin
object Accounts extends Controller {
val log = LoggerFactory.getLogger(getClass())
def session = Action { implicit request =>
log.trace("session {}", request)
val body: AnyContent = request.body
log.debug("body: {}", body);
val jsonBody: Option[JsValue] = body.asJson
Ok("Hello " + jsonBody)
}
}
这会在conf/logger.xml文件中产生问题。当我使用对象的专有名称时;controllers.admin.Accounts$在本例中,play运行时将stacktrace喷到我身上
09:08:05,885 |-ERROR in ch.qos.logback.core.joran.spi.Interpreter@24:62 - RuntimeException in Action for tag [logger] java.lang.IllegalArgumentException: Failed to parse input [controllers.admin.Accounts$]
at java.lang.IllegalArgumentException: Failed to parse input [controllers.admin.Accounts$]
at at ch.qos.logback.core.util.OptionHelper.substVars(OptionHelper.java:125)
...
我的conf/logger.xml看起来像
<logger name="play" level="info" />
<logger name="application" level="debug" />
<logger name="controllers.admin.Accounts$" level="trace" />
我猜它讨厌“$”,但Scala就是这样处理“对象”类型的getClass名称的。如何在logger.xml中正确声明此记录器?或者,我可以在播放控制器声明中做些什么来避免整个“$”问题,而不引入剪切和粘贴错误等?在创建记录器时,您可以尝试一个简单的特性来处理$的删除,如下所示:
trait ControllerLogging{
lazy val log = {
val className = getClass().getName match{
case x if x.endsWith("$") => x.substring(0, x.length() - 1)
case x => x
}
LoggerFactory.getLogger(className)
}
}
然后混合到控制器中:
object Accounts extends Controller with ControllerLogging
创建记录器时,您可以尝试一个简单的特性来处理$的删除,如下所示:
trait ControllerLogging{
lazy val log = {
val className = getClass().getName match{
case x if x.endsWith("$") => x.substring(0, x.length() - 1)
case x => x
}
LoggerFactory.getLogger(className)
}
}
然后混合到控制器中:
object Accounts extends Controller with ControllerLogging
这看起来很有希望。我来试一试,看起来很有希望。我要试一试。