在Scala中记录Play Framework 2的语法

时间:2013-09-21 11:44:43

标签: scala logging playframework playframework-2.0

这是一个非常愚蠢的问题,但是如何在Play Framework 2(以及Scala?)中方便地格式化日志字符串。

我用谷歌搜索但很难找到一个例子,基本上大多数链接都是在谈论配置Logback,我做得很好。

我基本上试图找到最好的风格方式来做类似的事情:

if(Logger.isDebugEnabled)
    Logger.debug("Modified: Id = '" + real_session_id + "', Modified = " + modified.toString)

来自C#背景(和log4net)我假设你可以这样做:

if(Logger.isDebugEnabled)
    Logger.debug("Modified: Id = '{0}', Modified = {1}", real_session_id, modified.toString)

但是我无法看到它如何与定义它的特性一起工作。我还看到了一些模糊的引用,指出如何使用惰性评估语法来避免检查Logger.isDebugEnabled

Logger.debug("Modified: Id = ${real_session_id}, Modified = ${modified.toString}")

使用Scala宏 - 但是再次,这不起作用,我可以找到很少的信息。

我错过了一些真正明目张胆的东西吗?

2 个答案:

答案 0 :(得分:9)

  1. 用于记录的框架是logback。键入:Logger.debug时,已隐式检查isDebugEnabled

  2. 对于日志记录的语法,请使用Scala字符串插值。

    Logger.debug(s"Modified: Id = '$real_session_id', Modified = $modified.toString")
    

答案 1 :(得分:1)

为什么不使用语言/ stdlib的标准字符串插值功能? http://docs.scala-lang.org/overviews/core/string-interpolation.html

如果我错过了一些关于你问题的重要信息,我道歉。

至于避免if (Logger.isDebugEnabled)检查,如果日志框架没有为传递给它的参数提供某种惰性评估方案,我首先会考虑定义自己的包装器:

object MyLazyLogger {
  def debug(msg: => Any) =
    if (Logger.isDebugEnabled) Logger.debug(msg)
}

另外,我不认为将内容插入到字符串中的方式与如果禁用日志时不评估debug()的参数有关 - 如果debug()声明它渴望 - 评估传递给它的任何参数,我无法通过使用字符串插值的“特殊形式”来看到您可以在调用站点更改为延迟评估。 (如果有人在这里证明我错了并教给我一些新东西,我会很高兴的。))

披露:我不熟悉Play(还),所以我只是在这里采取一般方法。