7

这是一个非常愚蠢的问题,但是如何在 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 宏——但同样,这不起作用,我可以找到很少的信息。

我在这里错过了什么真正公然的东西吗?

4

2 回答 2

9
  1. 用于日志记录的框架是 logback。当您键入 :Logger.debug时,isDebugEnabled已经隐式检查了。

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

    Logger.debug(s"Modified: Id = '$real_session_id', Modified = $modified.toString")
    
于 2013-09-21T12:00:50.230 回答
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 (还)不熟悉,所以我只是在这里对一般方法进行尝试。

于 2013-09-21T11:48:18.027 回答