Java 使用scala进行整洁的日志记录?

Java 使用scala进行整洁的日志记录?,java,scala,logging,slf4j,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

我喜欢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
由于日志记录,事情变得更复杂,代码变得更凌乱

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


如何在保持代码简单易懂的同时,通过强大的日志记录整理代码?(解决方案还没有发明?)或者有真正的清洁解决方案吗?

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

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) 
}

所以输入和输出将被记录下来

这个问题已经被回答和接受了,但还有另一个问题 在有限的调试环境下的解决方案;而且它可能是结合在一起的 使用现有的解决方案

充分披露:我已经发展,所以我有偏见;不管是不是 优雅是品味的问题

如果要执行与日志记录相反的操作,即发出调试 开发者和不想要的信息在部署的产品中,您可以 试试斯卡特的表情追踪

事实上,它们的存在是因为你提到的原因;在某种程度上 它们可以插入到源代码的右侧,因此会造成混乱 不会消失,但侵入性较小。至少这对我有用

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

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使用宏;如果此跟踪关闭,编译器将发出警告):

您会注意到,我没有编写冗长的跟踪字符串,而是自动编写Scart 添加诸如类、方法名称、行等信息,因为它是用于 调试,我个人指的是那些,不需要写很长的字符串

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

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


干杯。

顺便说一句,具有基本相同功能的多级日志输出可能被认为是反模式的。我在这里阅读了技巧7,记录每个方法的入口和出口,如果是这样的话,我需要用tracked(foo)封装每个方法,我认为没有人真正遵循这种模式,这是正确的吗?
def myFunc(args) =                                   s"myFunc($args)".e_++:
{
  doSomething(args)
}