하루에 0.01%라도 성장하자

Develop/Android

Timber와 Android Logger 개발 경험 공유 ( 긴 로그 기록, 로그 파일 저장 )

뚠님 2022. 6. 13. 11:21
반응형

Android에서 많이 유명한 로그 라이브러리다.

 

https://github.com/JakeWharton/timber

 

GitHub - JakeWharton/timber: A logger with a small, extensible API which provides utility on top of Android's normal Log class.

A logger with a small, extensible API which provides utility on top of Android's normal Log class. - GitHub - JakeWharton/timber: A logger with a small, extensible API which provides utility on...

github.com

 

설치법에 대한 내용은 위 사이트 들어가면 친절하게 안내되어 있다.

 

Timber의 장점은 Debug 모드일때는 로그를 찍지 않도록 설정이 가능하다는 점. ( Application 단에서 한번 조건을 걸어야 하지만 )

그리고 간단한 코드로 꽤나 상세한 로그를 확인할 수 있다는 점이다.

 

지금까지 Log 를 사용해서 로그를 찍던 개발자에게는 꽤나 좋은 라이브러리가 될 수 있다.

 

나같은 경우 위 Timber를 알기 전에 Log 에 대한 불편함을 느껴 이것저것 많은 기술 서치 끝아 자체적으로 Logger를 만들었다.

 

kotlin object 로 생성하여 싱글톤으로 구현하였고 기존 Log를 한번더 감싸서 로그를 조금 더 상세하게 만들도록 하였다.

 

기본적으로 e, w, i, d, v 를 만들었는데 아무래도 자체적인 커스텀을 하게 되면 필요한 로그방식이 있을때 추가하기 쉽다는 점이 좋은것 같긴 하다.

 

이것저것 블로거 분들의 좋은 코드들을 참고하여 만들어서 크게 대단한 코드는 없고, 다만 개발을 하면서 두가지 상황에 부딪혀 추가적으로 개발한 내용을 공유한다.

 

1. 너무나도 긴 로그 ( 4000자 이상 )

안드로이드 로그캣의 경우 4000자 이상이 넘어가는 로그가 찍히면 로그를 찍을 수 없다.

이런경우가 얼마나 있겠느냐 많은... retrofit 을 이용한 network 통신을할 때 json을 주고 받다 보면 종종 발생한다.

특히 ott 등 content metadata를 log로 찍어 확인해야 하는 상황이 발생할 경우가 그에 해당하는데, 이때 로그를 사용하기 위해 만든 function이 있다.

 

fun longLog(message: String) {
        if (message.length > 4000) {
            Log.d(TAG, message.substring(0, 4000));
            longLog(message.substring(4000));
        } else {
            Log.d(TAG, message);
        }
    }

사용법은 아래와 같다.

Logger.longLog(msg)

 

원리는 4000자 단위로 끊어서 longLog를 여러번 호출하여 4000자 이상의 로그가 나뉘어서 노출되도록 하였다.

 

 

2. 로그를 파일로 남겨야 한다.

로그캣으로 로그를 남기면 유일한 의존성은 무선랜이든 케이블이든 폰하고 PC가 연결되어 있어야 로그를 확인할 수 있다는 점이다.

 

이부분은 단순히 view와 기능들을 개발하는데는 무리가 없으나 간혹 간헐적으로 발생하는 에러들을 체크하기에는 무리가 있다 . 

 

그럴때 특정 경로에 로그의 내용을 파일형태로 저장하도록 하고, 해당 파일에 접근하여 로그를 볼 수 있도록 하였다.

 

fun appendLog(text: String) {
        if (GlobalApplication.DEBUG) {
            try {
                d(text)
                val storageDir: File? =
                    GlobalApplication.instance.mContext.filesDir
                val logFile = File(storageDir, "application_log.txt")
                if (!logFile.exists()) {
                    try {
                        logFile.createNewFile()
                    } catch (e: Exception) {
                        e.printStackTrace()
                    }
                }
                try {
                    val buf = BufferedWriter(FileWriter(logFile, true))
                    buf.append(createLogMsgForDebugFile(buildLogMsg(text)))
                    buf.newLine()
                    buf.close()

                } catch (e: Exception) {
                    e.printStackTrace()
                }
            } catch (e: Exception) {
                e.printStackTrace()
            }
        }
    }

    private fun createLogMsgForDebugFile(text: String): String {
        return "${DateUtils.getCurrentTimeFormatForDebug()} : ${buildLogMsg(text)}"
    }

 

이렇게 하면 해당 경로에 로그를 찍어서 파일형태로 관리 할 수 있다

 

여기서 가장 큰 주의사항은 릴리즈 모드일 때 해당 로그가 동작하지 않도록 해야 한다는 것이고. 이부분을 각별히 주의해야 한다. 

 

사용법은 아래와 같다.

Logger.appendLog(msg)

 

 

반응형