如何在logger.xml中声明对象的记录器?

时间:2013-05-24 16:14:39

标签: scala playframework logback

我需要对Play 2.1应用程序中的日志记录进行更精细的控制。为此,我一直在每个Controller中放置一个独特的记录器,如下所示:

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 $在这种情况下,播放运行时在我身上喷出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中做什么来正确声明这个记录器?或者,我可以在Play Controller声明中做些什么来避免整个'$'问题,而不会引入剪切和粘贴错误等?

1 个答案:

答案 0 :(得分:5)

你可以尝试一个简单的特性来处理在创建这样的记录器时删除$:

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