在我的日志条目中,我想记录调用日志方法的函数名称.
这是为了能够按功能名称自动过滤日志条目.这可能吗?有没有图书馆?现有库的任何扩展?
换句话说,是否可以提取执行上下文当前在运行时执行的scala函数的名称?
次要问题:我理解这可能是牵强附会的,但理想情况下,最好包含记录调用的最接近的命名函数,而不是scala为其生成隐藏名称的实际匿名函数.后者很难从日志中读取.
最佳答案 这是你可以使用的黑客.它遍历当前堆栈跟踪以查找第一个非匿名函数.
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版本中不会发生变化.