Vintage appMaker의 Tech Blog

[Android] Logcat 소스와 연동(링크)하기 본문

Source code or Tip/Android(Java, Kotlin)

[Android] Logcat 소스와 연동(링크)하기

VintageappMaker 2021. 12. 29. 21:22

 


Android를 개발하다보면 logcat을 많이 사용하게 된다. 그러다보니 수많은 로그를 출력하게 되는데, 정작, 그 로그를 보면서 "어디 소스에서 출력한 것이지?"하며 찾을 때가 있다. 그럴 경우, Android Studio에서는 2가지 기능으로 소스와 연동할 수 있는 데, 하나는 logcat 화면에서 소스와 연동할 수 있는 포멧으로 링크를 출력하는 것이고 나머지는 현재 실행되는 Thead의 stack 정보를 이용하여 소스와 클래스와 함수 정보를 출력하는 것이다. 

1. Android Studio의 logcat 화면에서 (파일명:라인번호)로 문자열을 출력하면 클릭 시, 소스로 이동가능
2. Thread.currentThread().stackTrace 배열의 
   fileName
   methodName
   className
   lineNumber
   
를 이용하여 현재 소스정보를 출력가능

 

아래는 위의 정보를 이용하여 logcat을 출력하는 클래스이다. 

class DUtil{
    companion object{

        // 확장함수와 class외에서 정의된 함수에서는
        // me에 패키지명(= 패키지명.파일명)을 직접 입력해주어야 한다.
        val tag = "DUTIL"
        fun d(me : String = "" , sLog : String){

            if (true && !BuildConfig.DEBUG) {
                return
            }

            for (i in Thread.currentThread().stackTrace.indices) {
                val fileName = Thread.currentThread().stackTrace[i].fileName
                val functionName = Thread.currentThread().stackTrace[i].methodName
                val className = Thread.currentThread().stackTrace[i].className
                val lineNumber = Thread.currentThread().stackTrace[i].lineNumber

                // me가 없으면 로그만 찍기
                if(me == ""){
                    Log.v(tag, sLog)
                    return
                }

                // 클래스명이 일치하지않으면 다음스택
                val clsTag = me.replace("class ", "")
                if(className.indexOf(clsTag) < 0 ) continue

                // (파일이름:줄번호) 형태로 출력하면
                // Android Studio의 logcat에서 링크가 생성됨
                var s = sLog
                s = "($fileName:$lineNumber) $functionName(): $s"
                Log.v(tag, s)

                // 최초 1회만 출력 후 종료
                return
            }

        }
    }
}

 

사용법은 다음과 같다. 

 

fun d(me : String = "" , sLog : String)

 

첫번째 파라메터(me)는 클래스 정보이다. 만약 class안에서 실행한다면 다음과 같이

this.javaClass.toString()을 넘기면 된다. 그리고 두번째 파라메터는 출력할 문자열이다. 

 

 

그리고 class안에 정의되지 않은 함수나 확장함수일 경우는 패키지명 + 파일명으로 첫번째 파라메터(me)에 넘기게 되면 사용가능하다. 

 

Comments