我喜欢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 ,因为它使代码更加强制且难以理解。)
如何通过强大的日志记录使代码简单易懂,如何整理代码? (解决方案还没有发明?)还是有真正干净的解决方案?
答案 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>
干杯。