Java 使用scala进行整洁的日志记录?
我喜欢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
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)
}