Logger Library를 사용하여 Log를 찍으면서 개발을 하던 와중,
의도치 않게 동일한 로그가 여러번 찍히는 문제가 발생하였다.
필자의 이해 부족으로 발생한 문제이지만, 추후 까먹지 않기 위해 글을 작성해 두고자 한다.
Logger의 기본적인 사용법은 해당 게시글을 확인하길 바란다.
우선 문제가 발생한 원인부터 파악해 보자.
Logger가 여러번 찍히는 문제가 발생했으므로,
Logger 라이브러리를 사용하는 곳에 일반 Log도 함께 사용하여 해당 부분이 호출되는 횟수가 두번인지, 한번이지만 로그가 두번 찍히는지 확인해 보았다.
분명히 한번 찍었는데, Log는 한번만 찍히고 Logger는 두번 찍히고 있다.
그렇다면, Logger를 사용한 부분에 문제가 있다고 보면 된다.
Logger는 사용하기 전에 LogAdapter를 추가해서 사용한다.
필자는 다음과 같이 BaseActivity에 선언해 두었다.
BaseActivity에서 init 해주고, MainActivity에서만 사용했으니 문제가 발생하면 이 곳 밖에 없다.
format을 커스텀하는 부분에서는 문제가 발생할 수 없으니, addLogAdapter에서 문제가 발생하게 된 것이다.
즉, addLogAdapter가 중복으로 호출되어, Logger를 사용했을 때 1개를 초과하는 어댑터가 호출이 되어 여러개의 로그가 찍히게 되는 것이다.
해당 문제가 발생한 이유는 다음과 같다.
abstract class BaseActivity<B : ViewDataBinding>(
@LayoutRes val layoutId: Int,
) : AppCompatActivity() {
BaseActivity는 abstract class이다.
즉, 추상 클래스이기 때문에 singleTon으로 BaseActivity를 사용할 수 없고, 다른 BaseActivity를 상속 받는 Activity를 생성할 때 마다 BaseActivity의 onCreate가 호출되고, initLogger의 addLogAdpater가 호출되어 반복적으로 같은 LogAdapter를 추가하게 된 것이다.
해당 문제를 해결하는 방법은 당연하다 시피
addLogAdapter를 한번만 호출하면 된다.
간단하게 해결하는 2가지 방법은 다음과 같다.
1. 반드시 한번만 호출되는 것이 보장되는 부분에서 초기화를 시킨다.
2. add된 LogAdapter가 반드시 하나만 존재하도록 한다.
1번 해결법은 아주 간단하다.
필자는 BaseActivity에서 BaseApplication으로 initLogger 함수를 옮겼다.
Application단에서 Koin과 DataStore를 선언하여 사용하고 있었는데, 해당 부분에 Logger에 대한 Adapter를 추가시켜 주었다.
Application단은 반드시 한번만 호출되는 것이 보장되기 때문에 이곳에서 초기화 함으로써 addLogAdpater가 중복 호출되는 것을 방지할 수 있다.
1번 해결법을 사용할 위치가 마땅치 않다면,
2번 해결법을 통해 해결하면 된다.
add된 LogAdpater가 반드시 하나만 존재하도록 하기 위해서는 어떻게 해야할까?
addLogAdapter를 사용하기 전에 add된 LogAdpater를 초기화 시켜주면 된다.
Logger.clearLogAdapters()
즉, 위의 한 줄을 추가하게 된다면 간단하게 해결된다.
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this, layoutId)
binding.lifecycleOwner = this
initLogger()
}
private fun initLogger() {
val logFormat = PrettyFormatStrategy.newBuilder()
.showThreadInfo(false)
.methodCount(5)
.tag("CustomLogTag")
.build()
Logger.clearLogAdapters()
Logger.addLogAdapter(AndroidLogAdapter(logFormat))
}
이처럼 BaseActivity에서 사용할 때, 항상 addLogAdpater 가 이루어지기 전에 clearLogAdpaters()를 호출하여 추가된 어댑터를 모두 제거하고 마지막에 호출된 어댑터를 추가하도록 하면 된다.
필자가 이해도가 부족하고 너무 생각없이 추가하다보니 발생한 문제인데, 생각보다 어디가 문제인지 찾는데 시간이 걸린것 같다.
물론, 로그가 두번 찍힌다고 해서 큰 오버헤드가 발생하거나 다른 사이드 이펙트가 발생하지는 않지만,
애초에 로그를 편하게 보기위해 사용한 라이브러리가 중복되어 보여져서 더 보기 불편해 진다면 사용할 이유가 없을 것 같아서 정리해 본다.
2번 해결법 같은 경우에는 상황에 따라 다른 스타일의 로그를 찍어야 하는 경우에 사용하면 괜찮을 것 같지만, 필자처럼 중복된 호출이 문제가 되는 경우에는 사용하지 않는 것이 좋을 것 같다.
근본적인 원인을 해결하는 것은 한번만 호출되게 하는 것인데, 여러번 호출되면서 한번만 호출한 것 처럼 임시로 처리하는 것은 좋은 해결 방법이 아니기 때문이다.
간단하게 사용할 수 있다고 해서, 너무 무지성으로 사용했던 것을 반성하게 되는 문제였다.
사실, Intro > Permission > Main 순서대로 Activity가 호출되어 같은 로그가 3번 호출되어서 해당 문제를 발견하게 되었는데
더 많은 액티비티를 사용했다면 정말 답도 없었을 것이다.
간단하게 사용 가능하더라도, 조금 더 생각을 하고 사용을 해야겠다.
'Android > Utility' 카테고리의 다른 글
[Android] Zxing 라이브러리를 사용하여 QR 코드를 읽어보자 (0) | 2022.04.02 |
---|---|
[Android] JitPack을 사용하여 라이브러리 모듈을 배포해보자. (0) | 2022.03.15 |
[Android] TedPermission을 사용하여 권한을 편하게 체크해보자. (0) | 2022.03.06 |
[Android] Logger Library를 사용하여 보기 좋은 로그를 찍어보자. (0) | 2022.03.03 |
[Android] VM 환경 Installation failed 에러 (0) | 2022.02.28 |