斯卡拉记录功能名称(scala logging function name)

2019-08-17 17:44发布

在我的日志条目,我想记录的功能名称中的日志方法被调用。

这是自动能够通过函数名称来过滤日志条目。 这可能吗? 对于任何图书馆? 与现有的库中的任何扩展?

换句话说,是能够提取的执行上下文目前在运行时执行阶函数的名称?

次要问题:我理解这可能是牵强附会,但理想的,其中包含日志调用最接近封闭命名函数是首选的而不是斯卡拉生成一个神秘的名字实际匿名函数。 后者将是很难从日志中读取。

Answer 1:

这里是你可以使用一个黑客 。 它遍历当前栈跟踪,找到第一个非匿名函数。

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 logging function name
标签: scala logging