我需要更精细地控制我在 Play 2.1 应用程序中的日志记录。为此,我一直在每个控制器中放置一个独特的记录器,如下所示:
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$ 在这种情况下,播放运行时会在我身上喷出堆栈跟踪。
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 声明中做些什么来避免整个“$”问题而不引入剪切和粘贴错误等?