在我的日志条目中,我想记录调用 log 方法的函数名称。
这是为了能够自动按函数名称过滤日志条目。这可能吗?有任何图书馆吗?现有库的任何扩展?
换句话说,是否可以提取执行上下文当前在运行时执行的 scala 函数的名称?
第二个问题:我知道这可能牵强,但理想情况下,包含日志调用的最接近的封闭命名函数是首选,而不是 scala 为其生成神秘名称的实际匿名函数。后者很难从日志中读取。
这是您可以使用的hack 。它遍历当前堆栈跟踪以找到第一个非匿名函数。
def printStackFrame() {
/* Get current stack trace. The first frame is this method call. */
val st = new RuntimeException().getStackTrace.view.drop(1)
// st take(5) foreach println /* Print a few frames of interest */
val name =
st.map(ste => ste.getClassName + "." + ste.getMethodName)
.dropWhile(_.matches(""".*anonfun\$\d*\.apply\$mcV\$sp$"""))
.apply(0)
println(name)
}
你可以像这样使用它:
class MyClass {
def mydef() {
printStackFrame()
}
def myhof(f: () => Unit) {
f()
}
}
val mc = new MyClass
mc.mydef() // Main$$anon$1$MyClass.mydef
mc.myhof(mc.mydef) // Main$$anon$1$MyClass.mydef
mc.myhof(() => {printStackFrame()}) // Main$$anon$1$MyClass.myhof
明显的缺点是它的脆弱性。我完全不确定上面的单个正则表达式是否足以忽略所有匿名或其他不感兴趣的函数。即便如此,也不能保证命名模式在未来的 Scala 版本中不会改变。