Firebase Analytics 로 앱 에러 로깅하기

Yechan Jung·2024년 6월 11일

개발

목록 보기
5/6
post-thumbnail

앱 실사용 중에는 알 수 없는 이유로 일어나는 에러가 있다.
또 이 에러가 간헐적으로 일어난다면 이유를 찾기도 어렵다.

Firebase Analytics(이하 FA)의 이벤트 기능을 이용하여 앱 전체에서 일어나는 에러를 로깅하여 보자.

먼저 FA를 logEvent 함수를 잘 이해할 필요가 있다.
처음에는 logEvent의 이벤트 이름으로 'error'를 사용해서 로깅하려 하였다.
그런데 다른 이름의 이벤트는 잘 전송되는데 'error'라는 이름만 안된다는 사실을 발견하였다.

그 이유를 찾아보니
Firebase Analytics Event
'event'등의 이름은 predefined 되었기 때문에 사용할 수 없다는 것이다.

logEvent 함수 특성상 에러 로그를 받을 수 없었기 때문에 이 원인을 찾는 것이 힘들었다.

두번째로는 ErrorBoundary를 app.tsx에 선언함으로써 앱 내부에서 일어나는 오류를 로깅하려 하였다.
그러나 이 방법은 2가지 문제가 있었다.
첫번째는, ErrorBoundary가 선언된 app.tsx가 렌더링되기 전에 일어난 오류는 확인할 수 없다는 것이다.
두번째는, 안 그래도 긴 app.tsx의 provider hell에 ErrorBoundary 컴포넌트가 한 단계 기여를 한다는 것이다.
Provider Hell

괜찮은 방법을 찾는 도중 자바스크립트 window 객체에 onerror가 있다는 사실을 발견하였다.

window.onerror = (event, source, lineno, colno, error): void => {
  const analytics = getAnalytics(app);
  logErrorEvent(analytics, event, source, lineno, colno, error);
};

해당 코드로 기존의 56줄 정도의 ErrorBoundary 코드를 대체할 수 있었다.
그리고 해당 로직을 index.tsx에 선언함으로써 app.tsx의 여러 로직에서 일어나는 에러들을 다 이벤트로 처리하여 로깅할 수 있게 되었다.

export const logErrorEvent = (
  event: string | Event,
  source: string | undefined,
  lineno: number | undefined,
  colno: number | undefined,
  error: Error | undefined,
) => {
  analytics.then((analytic) => {
    if (analytic) {
      const errorMsg = error ? error.stack : '';
      const errorPosition = errorMsg?.split('\n')[1];
      logEvent(analytic, 'errorEvent', {
        event,
        source,
        lineno,
        colno,
        error: errorMsg,
        errorPosition,
      });
    }
  });
};

그리고 에러가 일어난 정확한 파일 위치와 에러 타입을 알기 위해 에러이벤트의 파라미터를 위와 같이 설정하였다.

에러 위치를 알 수 있다!
에러 위치를 알 수 있다!

profile
꿈꾸는 개발자

0개의 댓글