2013-03-19 74 views
4

在我的日誌條目,我想記錄的功能名稱中的日誌方法被調用。階記錄功能名稱

這是自動能夠通過函數名稱來過濾日誌條目。這可能嗎?有任何圖書館?現有庫的任何擴展?

換句話說,是能夠提取的執行上下文目前在運行時執行階函數的名稱?

二級問題:我知道這可能是牽強的,但理想情況下,包含日誌調用的最接近的封閉命名函數是首選,而不是實際的匿名函數,scala會生成一個神祕的名稱。後者很難從日誌中讀取。

+0

如果您還沒有編寫的代碼是,你可以包括您撥打的記錄器功能的名稱。 – korefn 2013-03-19 07:45:53

回答

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版本中不會改變。