2013-03-19 4 views
4

내 로그 항목에 로그 메소드가 호출 된 함수 이름을 기록하고 싶습니다.스칼라 로깅 함수 이름

로그 항목을 기능 이름별로 자동 필터링 할 수 있습니다. 이것이 가능한가? 어떤 도서관 에서요? 기존 라이브러리가있는 모든 확장?

즉, 실행 컨텍스트가 런타임에 현재 실행중인 스칼라 함수의 이름을 추출 할 수 있습니까?

2 차 질문 :이 방법은 멀리 가져 왔을 수 있지만 가장 이상적인 것은 스칼라가 암호명을 생성하는 실제 익명 함수 대신 로깅 호출이 포함 된 가장 가까운 함수를 사용하는 것입니다. 후자는 로그에서 읽기가 어려울 것입니다.

+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 

명백한 단점이 취약성이다. 위의 단일 정규 표현식이 모든 익명 또는 비 재미있는 함수를 무시하기에 충분한 지 확실하지 않습니다. 그리고 스칼라 버전에서 명명 스키마가 변경되지 않는다고 보장 할 수는 없습니다.