2013-03-19 3 views
4

В моих записях журнала я хотел бы записать имя функции, в которой был вызван метод журнала.scala logging function name

Это автоматический способ фильтрации записей журнала по имени функции. Это возможно? С любыми библиотеками? Любые расширения с существующими библиотеками?

Другими словами, можно ли извлечь имя функции scala, выполняемой в настоящий момент во время выполнения?

Вторичный вопрос: Я понимаю, что это может быть надуманным, но в идеале предпочтительной является ближайшая закрытая именованная функция, которая содержит вызов регистрации, вместо фактической анонимной функции, которая scala генерирует критическое имя. Последнему было бы трудно читать из журналов.

+0

Если вы еще не написали код, вы можете включить имя функции, в которой вы вызываете регистратор. – korefn

ответ

2

Здесь взломать, что вы могли бы использовать. Он пересекает текущую трассировку стека, чтобы найти первую не анонимную функцию.

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.