使用scala进行整理日志记录?

时间:2014-03-25 15:46:06

标签: java scala logging slf4j

我喜欢scala,因为它可以帮助我获得更清晰的代码。

然而,在登录时,我觉得我的代码变得杂乱......

def myFunc(args) = {
  log.trace("entering myfunc, args are ... ")
  val result = doSomething()
  log.info("I really want to print that result which is {}", result)
  log.trace("exiting myfunc result {}", result)
  result
}
你可以看到

,而不只是打电话

def myFunc(args) = doSoemthing

我需要将结果拆分为var,以便我可以先记录它然后再返回它。 现在,在更复杂的用例中,这是一个简单的用例,我的方法中有更多的记录,有些info一些debug事情变得更加复杂,而且由于日志记录,代码变得更加cluttered。 。

虽然我可以使用另一种方法来包装我的方法,这种方法会在进入和退出时添加日志记录,这会使我的代码更加复杂,所以我正在寻找一种非常干净的日志记录解决方案,而不仅仅关注方法的进入和退出(I不想使用 AOP ,因为它使代码更加强制且难以理解。)

如何通过强大的日志记录使代码简单易懂,如何整理代码? (解决方案还没有发明?)还是有真正干净的解决方案?

2 个答案:

答案 0 :(得分:1)

首先,没有什么可以阻止您将结果定义为val,而不是var。接下来,有kestrel combinator这样的东西(另见专门针对日志主题的链接答案),它通常用于这样的主题:

def myFunc(args) = {
  log.trace("entering myfunc, args are ... ")
  doSomething().tap { result => 
    log.info("I really want to print that result which is {}", result)
    log.trace("exiting myfunc result {}", result)
  }
}

接下来,我确实认为有类似AOP的方法,比如 scala virtualized (它允许你使用基本的语言语法),但是对我来说这感觉真是太过分了,我想你可以滚动出一组助手并将它们用作:

traced(foo) { x => 
  myFunc(x) 
}

因此将记录输入和输出

答案 1 :(得分:1)

这个问题已经得到了回答和接受,但还有另外一个问题 解决方案在有限的调试环境中;它可能会合并 与现有的解决方案

完全披露:我已经开发Scart,所以我有偏见;不管它是不是 优雅是品味的问题!

如果您要执行 tracing ,而不是记录发出调试 开发人员的信息和不希望在已部署的产品中,您可以 试试Scart的Expression Tracers。

实际上,他们之所以存在,是因为你提到的原因;在某种程度上 它们可以插在源代码的右侧,因此杂乱无章 并没有消失,但侵扰性较小。至少这对我有用。

我没有尝试过以下内容,但在您的用例中可能看起来像:

def myFunc(args) = {                             
  val result = doSomething(args)
  log.info("I really ... which is {}", result)
  result                                             e_++: s"myFunc($args)"
}

我留下了日志信息,否则:

def myFunc(args) = doSomething(args)                 e_++: s"myFunc($args)"

或者更确切地说(Scart使用宏;如果此跟踪关闭,编译器会发出警告):

def myFunc(args) =                                   s"myFunc($args)".e_++:
{
  doSomething(args)
}

你会注意到我没有写出冗长的跟踪字符串,但Scart会自动 添加类,方法名称,行#等信息。因为它是 调试,我亲自参考那些并且不需要写很长的字符串。

还有更多选择,最终我应该将它们全部记录下来。

此外,Scart不需要记录器来操作。为了在日志中输出其跟踪,您必须指定一个printer函数,该函数使用类型为object Settings的记录器(在Scart设置String => Unit中)。< / p>

干杯。