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$ この場合、play ランタイムはスタックトレースを吐き出します。
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 宣言で何ができますか?