Crahslytics에서 오류 로그만으로는 알 수 없거나 재현할 수 없는 문제들을 파악하는 여러가지 방법에 대해서 공유합니다.
이전 포스팅에서 아름답게 오류를 처리하는 방법에 대해서 공유해드렸었습니다.
아름답게 앱 오류 처리하기 앱에서 오류가 발생해도 사용자가 좋은 경험을 유지할 수 있도록 처리하는 글입니다.medium.com
이번 포스팅은 아름답게 처리한 오류를 스마트하게 확인하고 수정하는 방법에 대한 글입니다.
Crashlytics가 뭔가요?
아직 Crashlytics를 사용중이지 않다면 공식문서를 살펴보시고 개념에 대해서 익히시고 설정을 하신뒤 이 글을 읽어보시는게 좋습니다.
Crashlytics를 사용하게 되면서 우리는 실제 사용자들이 앱을 사용하면서 발생하는 오류에 대해서 파악할 수 있게 되었습니다.
오류 리포팅을 확인하고 해당 오류들을 수정하고 배포할 수 있게 된것이죠
(너는 무슨앱인데 이렇게 오류가 많이 발생하니..)
저의 하루 일과는 Firebase 콘솔에서 운영중인 서비스의 오류를 확인하는 것으로 시작합니다.
심각한 오류의 경우 바로 Hotfix 버전으로 배포하거나 그렇지 않은 경우는 수정후 다음버전에 반영하는 작업을 진행합니다.
Crashlytics에서 제공하는 기본적인 기능외에 추가적으로 사용할수 있는 기능들에 대해서 실제 사례와 함께 소개해 드리겠습니다.
1. setUserIdentifier
오류가 발생했는데 이게 어떤 사용자한테 발생한 오류인지 알 수가 없습니다.(고객한테 죄송하다고 사과하고 싶은데 말이죠)
고객문의로 고객이 오류가 발생해서 앱이 안된다고 합니다. 차량 견적을 올리는데 오류가 발생한다고 합니다. 앱이 죽었는데 왜 죽었는지 모르겠다고 합니다.
이럴때 사용자의 ID를 설정해두면 유용하게 활용할 수 있습니다.
Android
Crashlytics.setUserIdentifier('user123456789')
ios
Crashlytics.sharedInstance().setUserIdentifier('user123456789')
https://firebase.google.com/docs/crashlytics/customize-crash-reports?platform=android#set_user_identifiers
위와 같이 사용자의 ID를 설정하셨다면 오류가 발생하는 건마다 해당 사용자의 ID를 확인하실 수 있습니다.
(오류가 발생한 사용자의 기기정보 및 ID)
또한 반대로 사용자의 ID가 발생한 오류 목록을 조회할 수도 있습니다.
(해당 사용자가 앱을 사용하면서 발생한 오류목록)
2. key
`setUserIdentifier()`의 확장버전으로 추가적으로 필요한 데이터들을 key로 설정할 수 있습니다.
ID외에 정보를 알고 싶을때(권한 허용 여부, 기기 네트워크 상태, uuid 등)
사용자의 마지막 액션을 알고 싶을때( 견적요청을 몇단계까지 했었는지, 가장 최근에 확인한 차량이 어떤것인지 등)
대부분 서버에서 API호출 로그나 사용자DB를 통해서 확인가능한 내용들이겠지만 (서버개발자를 귀찮게 하지 않고) 리포팅 화면에서 오류가 발생한 시점에서의 필요한 데이터에 대해서 확인할 수 있습니다.
Android
Crashlytics.setInt('current_level', 3) Crashlytics.setString('last_UI_action', 'logged_in')
ios
Crashlytics.sharedInstance().setIntValue(42, forKey: 'MeaningOfLife') Crashlytics.sharedInstance().setObjectValue('Test value', forKey: 'last_UI_action')
https://firebase.google.com/docs/crashlytics/customize-crash-reports?platform=android#add_custom_keys
3. logException
서비스를 운영하다보면 오류가 아니지만 오류인 상황(?)이 있습니다
심각하게 앱이 죽는 오류는 아니지만 수정해야 하는 오류들을 수집하고 싶을때
논리적으로 발생할 수 없는 케이스를 파악하고 싶을때(경매를 진행하지 않은 차량인데 딜러의 견적이 있는 경우, 해당 화면에 진입할 수 없는 사용자인데 해당화면이 보여진 경우 등)
이때 logException으로 오류는 아니지만 오류인 내용들을 기록해두면 콘솔에서 확인할 수 있습니다.
logException을 잘 활용해서 발생하면 안되거나 유효하지 않은 앱내의 접근에 대해서도 파악할 수 있습니다.
(접근하면 안되는 차량에 접근하려고 하다니..)
(발생할 수 없는 case가 발생했다는건 서버에서 특정값을 안줬다는 뜻)
Android
Crashlytics.logException(e)
ios
Crashlytics.sharedInstance().recordError(error)
https://firebase.google.com/docs/crashlytics/customize-crash-reports?platform=android#log_non-fatal_exceptions
4. log
사용자가 어떤 화면 경로를 따라서 실행하다가 오류가 발생했는지 알고 싶을때
조회한 화면이나 기능들이 어떤것들인지 확인하고 싶을때
기타 사용자의 행동들을 Log로 남겨서 오류를 파악할때 보고 싶을때
개발하면서 찍는 용도의 Log와 비슷한 개념으로 Crashlytics의 log를 사용할 수 있습니다.
(차량 구독하는 화면으로 이동하다가 오류 발생했다는것을 알 수 있음)
추가적으로 다양한 로그들을 활용한다면 좀더 상세하고 유용한 로그들을 가지고 오류 재현경로를 파악할 수 있습니다.
주요화면들을 조회할때 해당 화면들의 내용도 log로 남기고, API를 호출할때도 해당 정보들도 log로 남기는등 다양한 사용자의 활동을 log로 남겨두면 오류 재현을 하는데 도움이 됩니다.
(블라블라 api를 사용하는 기능과 차량상세화면을 들어왔다가 문제가 발생한 case라는것을 알 수 있음)
Android
Crashlytics.log('message')
ios
CLSLogv('%@', getVaList([string]))
https://firebase.google.com/docs/crashlytics/customize-crash-reports?platform=android#add_custom_log_messages
기타
앱분리
Crashlytics의 앱을 개발환경별로 분리하면 QA에서 발생하는 오류와 실제 서비스에서의 오류를 구분해서 파악할 수 있습니다.
메모
해당 이슈에 대해서 기록해두거나 다른사람들이 알아야할것들 등에 대해서 메모로 남겨둘 수 있습니다.
주로 이 이슈를 해결하기 위한 Jira이슈 티켓 링크나 fix될 버전정보, 이 이슈와 관련해서 나눈 대화링크 등에 대해서 남겨둡니다.
다만 이 기능에서는 누가 메모를 남겼는지 확인 할 수가 없기때문에 Firebase에서 메모기능에 대한 작성자 표시기능을 추가해주면 좋겠습니다.
마치며
오류를 수정할때 제일 미칠것 같은 상황이 해당 현상이 재현이 안될때 입니다
(제 컴퓨터에서는 되는데요)
이 포스팅을 참고하셔서 여러가지 유용한 로그들로 오류들을 정확하게 파악하고 편안하게 해결할 수 있으셨으면 합니다.
Crashlytics를 사용하면서 추가적인 팁이나 피드백이 있으시다면 댓글로 남겨주시면 감사하겠습니다.
저희와 함께 헤이딜러 서비스를 발전 시켜나가실 분들을 기다리고 있습니다.
http://bit.ly/prnd-hiring
위의 채용링크로 많은 지원부탁드립니다.
감사합니다.