0

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 宣言で何ができますか?

4

1 に答える 1

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
于 2013-05-24T18:13:03.987 に答える