Skip to Content
Packages@howmuchhome-web/logger

@howmuchhome-web/logger

Datadog 및 Sentry 로깅을 추상화한 패키지입니다. 사용법은 로깅 가이드를 참고하세요.

Logger

모든 로깅의 진입점이 되는 클래스입니다. 모든 메서드는 static입니다.

import Logger from '@howmuchhome-web/logger';

메서드

메서드환경설명
Logger.log(message, options?)클라이언트Datadog Browser Logs에 로그 전송
Logger.addAction(name, context?)클라이언트Datadog RUM 커스텀 액션 기록
Logger.startView(name)클라이언트Datadog RUM 뷰 전환 기록
Logger.captureError(error, options?)서버/클라이언트Sentry에 에러 전송

서버 환경에서 log, addAction, startView를 호출하면 아무 동작도 하지 않습니다 (no-op).

Logger.log(message, options?)

Datadog Browser Logs로 커스텀 로그를 전송합니다.

Logger.log(message: string, options?: { type?: 'ok' | 'info' | 'warn' | 'error' | 'debug'; context?: any; })

Logger.addAction(name, context?)

Datadog RUM에 커스텀 액션을 기록합니다.

Logger.addAction(name: string, context?: object)

Logger.startView(name)

Datadog RUM에 뷰 전환을 기록합니다.

Logger.startView(name: string)

Logger.captureError(error, options?)

Sentry에 에러를 전송하고 eventId를 반환합니다.

Logger.captureError(error: Error, options?: { transactionName?: string; level?: ErrorLevel; // 기본값: ErrorLevel.ERROR tags?: Record<string, string>; fingerprint?: string[]; extra?: Record<string, unknown>; }): string

levelErrorLevel.IGNORE이면 Sentry에 전송되지 않습니다.

LoggerProvider

앱 루트에 마운트합니다. ServerLoggerClientLogger를 합성한 컴포넌트로, 다음을 모두 처리합니다.

  • Datadog RUM 초기화
  • Datadog RUM / Sentry 사용자 컨텍스트 설정
  • OpenTelemetry span 속성 기록 (서버)
import {LoggerProvider} from '@howmuchhome-web/logger';
<LoggerProvider user={user}> {children} </LoggerProvider>

Props

프로퍼티타입설명
user{ id: string; email?: string; username?: string } | null로그인한 사용자. null이면 익명 ID 자동 생성
servicestringDatadog RUM 서비스 이름 (기본값: 'howmuchhome-web')
childrenReactElement

ServerLogger

서버 컴포넌트. Sentry 사용자 컨텍스트 설정 및 OpenTelemetry span 속성(usr.id, enduser.id, usr.name)을 기록합니다.

ClientLogger

클라이언트 컴포넌트. 마운트 시 Datadog RUM을 초기화하고, 사용자 변경을 감지하여 Datadog RUM과 Sentry에 사용자 정보를 설정합니다. 중복 초기화는 datadogRum.getInitConfiguration() 체크로 방지합니다.

initSentry

클라이언트는 instrumentation-client.ts, 서버/엣지는 instrumentation.tsregister()(동적 import)에서 호출하는 초기화 함수입니다. NEXT_PUBLIC_ENV === 'production'일 때만 Sentry.init을 호출합니다.

브라우저 전용 패키지 오염을 방지하기 위해 메인 패키지가 아닌 서브패스에서 import합니다.

import {initSentry} from '@howmuchhome-web/logger/sentry'; initSentry();

유틸리티

generateAnonymousId

비로그인 사용자를 위한 익명 ID를 생성합니다. LoggerProvider에서 내부적으로 사용됩니다.

import {generateAnonymousId} from '@howmuchhome-web/logger'; generateAnonymousId(); // 'anonymous-1712345678901-k3j7x2abc'

반환 형식: anonymous-{Date.now()}-{random 9자리 base36}

Native (Expo)

Logger 자체는 web·native 공용(packages/logger/index.ts)이라 애플리케이션 코드는 native 에서도 동일하게 Logger.log/addAction/startView/captureError 를 씁니다. 다만 이 패키지가 직접 import 하는 SDK(@datadog/browser-logs·@datadog/browser-rum·@sentry/nextjs)는 브라우저/Next 전용이라 RN 에서 그대로 못 씁니다. 공유 패키지를 수정하지 않고 apps/native-app/metro.config.js 의 커스텀 resolveRequest 가 native 번들에서만 이들을 갈아끼웁니다: Datadog 브라우저 SDK → src/shims/datadogMobile.ts(@datadog/mobile-react-native 어댑터), @sentry/nextjs@sentry/react-native.

그 결과 native 에서 LoggerProvider/initSentry 대신 <DatadogProvider> 와 RN initSentry 로 초기화하며, RUM/Logs 는 Datadog mobile SDK 로, crash 를 포함한 에러는 Sentry(@sentry/react-native)로 갑니다. Datadog 미init 시 어댑터 호출은 조용히 no-op 되는 등 동작 차이가 있으니 자세한 내용은 native 로깅·관측을 참고하세요.

Last updated on