개요
안드로이드 개발을 하며 디버깅을 위한 로그 확인에서 나아가,
실제 사용자가 애플리케이션을 사용하며 생긴 이슈는 어떻게 확인할 수 있을까요?
방법은 바로 이슈 발생 가능성이 있는 로직에 로그를 작성하고 파일로 저장하여 개발자가 직접 확인하는 것입니다.
Log 확인을 위해 Logger 라이브러리를 사용하였고, Logger 라이브러리 소개 문서를 확인하시면 도움이 됩니다.
하지만 로그를 파일로 저장하기 위해 공식 문서와 해당 소스코드를 확인해 보니 몇 가지 제약사항이 있었습니다.

첫째는 로그 파일은 앱 외부 디렉터리에 저장되고(저장 위치 변경 불가),
둘째는 고정된 500K의 파일 크기를 변경할 수 없다는 점이었습니다.
그래서 오픈소스인 Logger의 저장 관련 코드(Java)를 참고하여 확장 가능한 새로운 저장 기능을 구현해 보았습니다.
구현방법
기존 Logger의 LogAdapter와 LogStrategy의 인터페이스를 확장하여,
CustomDiskLogAdapter와 CustomDiskLogStrategy 클래스를 구현하였고 코드는 Kotlin으로 작성했습니다.
뿐만 아니라 기존 MainThread에서 생성된 로그를 BackgroundThread에서 저장하기 위해 Handler를 통해 Thread 간 메시지를 주고 받는 방식에서, Coroutines를 적용하여 Dispatchers.IO (IO 전용 Thread)에서 작업을 진행했습니다.
CustomDiskLogAdapter (해당 코드는 Git에 정리 및 공개해 두었습니다.)
Parameter | Type | Description | Default | 비고 |
folder | File | 로그 저장할 폴더 위치 | - | - |
logLevel | Int | 저장하고자 하는 로그 level | Logger.INFO | 지정한 로그 level 이상의 로그만 저장 |
maxfileSize | Int | 파일 크기 | 500*1024 (500KB) | 파일 이름은 "yyyy-MM-dd_index"이고 / 같은 날짜에 파일 크기 초과하면 index 증가한 새로운 파일 생성(ex. 2022-02-27_1.txt) |
maxfilecount | Int | 파일 개수 | 3개 (최대 1.5MB) | 개수 초과하면 날짜순으로 오래된 파일부터 삭제 |
사용 및 확인 방법
1. Application 클래스에서 Logger 초기화 시 CustomDiskLogAdapter를 추가
val diskPath = applicationContext.filesDir.path
val folder = "$diskPath/$LOGGER_DIRECTORY_NAME"
val file = File(folder)
val customDiskLogAdapter = CustomDiskLogAdapter(
folder = file,
logLevel = Logger.INFO,
maxFileSize = 500 * 1024,
maxFileCount = 3
)
Logger.addLogAdapter(customDiskLogAdapter)
2. 테스트를 위한 로그 작성
Logger.i("Test CustomDiskLogAdapter From HomeFragment!")
3. 생성된 폴더 확인

4. 생성된 파일 확인

결론
이 방법을 통해 이슈 발생 가능성이 있는 로직에 로그를 작성하고,
이슈가 있는 사용자에게 동의를 구한 뒤 로그파일을 확인한다면 보다 더 문제를 잘 해결할 수 있을 것이라 생각합니다.
물론 사용자 로그 확인을 위해 다른 두 가지 방법이 존재합니다.
- 사용자의 단말에서 직접 DumpLog(*#9900#)확인
- Firebase Crashlytics를 통해 로깅 (최대 64KB)
하지만 1번 방법은 사용자들에게 익숙한 방법이 아니어서 번거롭게 만들 가능성이 있고,
2번 방법은 어떤 사용자인지 알 수 없다는 점에서 해당 기능을 구현해 보았습니다.
참고
'Android' 카테고리의 다른 글
[Android] LiveData (0) | 2022.03.09 |
---|---|
[Android] Activities and Intents (0) | 2022.03.01 |
[Android] 깔끔한 Log를 사용하여 생산성 향상하기 (0) | 2022.02.26 |
[Android] RecyclerView를 사용해야 하는 이유 (feat. ListView) (0) | 2022.02.20 |
[Android] 웹뷰 스크롤 하단에 native 버튼 위치시키는 방법 (0) | 2021.09.20 |