Remote Logging은 모바일 디바이스에서 원격 서버로 로그를 전송하여 중앙 집중식 분석 및 모니터링을 수행하는 메커니즘입니다. 디바이스에 데이터를 저장하는 로컬 로깅과 달리, 원격 수집은 모든 사용자 디바이스의 오류와 이상 징후를 실시간으로 확인할 수 있습니다. Sentry Resource Library에 따르면, remote logging을 사용하는 애플리케이션은 출시 후 첫 1시간 이내에 프로덕션 버그의 92%를 발견하는 반면, 크래시 리포트만 사용하는 경우 15%에 불과합니다. 이는 모든 모바일 개발 팀에 필수적인 도구입니다: Firebase Crashlytics, Sentry 및 Datadog는 iOS와 Android용 SDK를 제공합니다.
주요 포인트
Remote Logging은 원격 디바이스에서 로그를 수집하여 분석을 위해 중앙 서버로 전송하는 프로세스입니다. 모바일 개발의 맥락에서 remote logging은 크래시 리포트뿐만 아니라 커스텀 이벤트, breadcrumbs, 성능 메트릭 및 사용자 시나리오도 포함합니다.
Remote logging과 crash reporting의 주요 차이점은 사전 대응성입니다. Crash reporting은 이미 발생한 애플리케이션 크래시에 대한 데이터만 수집합니다. Remote logging은 크래시 전의 이벤트 시퀀스(사용자가 연 화면, 실행한 요청, 입력한 데이터)를 수집합니다. 이를 통해 사용자와의 통신 없이 오류 시나리오를 재현할 수 있습니다.
Apple은 .logarchive를 통한 원격 로그 수집의 내장 메커니즘을 제공하지만, 프로덕션 애플리케이션에서는 거의 항상 타사 서비스가 사용됩니다. Android SDK에는 Logcat이 포함되어 있으며 ADB를 통해 원격으로 액세스할 수 있지만, 디버깅 모드가 아닌 최종 사용자 디바이스에는 액세스할 수 없습니다.
Remote logging 아키텍처는 세 가지 구성 요소로 이루어집니다: 디바이스의 클라이언트 SDK(로그 수집 및 버퍼링), 데이터 전송을 위한 전송 프로토콜, 저장 및 시각화를 위한 서버입니다.
| 구성 요소 | 역할 | 예시 |
|---|---|---|
| 클라이언트 SDK | 수집, 버퍼링, 배칭 | Firebase SDK, Sentry Cocoa, Timber |
| 전송 | HTTPS를 통한 데이터 전송 | REST, gRPC, WebSocket |
| 서버 | 저장, 인덱싱, 알림 | Sentry, Crashlytics, Datadog |
클라이언트 SDK는 로그를 RAM에 버퍼링하고 주기적으로 배치로 서버에 플러시합니다. 디바이스가 오프라인 상태이면 로그가 로컬 파일에 저장되고 다음 네트워크 연결 시 전송됩니다. 버퍼 크기와 전송 간격은 구성 가능하며, 일반적인 값은 50개 이벤트 또는 30초입니다.
HTTPS REST는 remote logging에서 가장 일반적인 프로토콜입니다. SDK는 로그를 JSON으로 직렬화하고 POST 요청을 통해 서버 엔드포인트로 전송합니다. gRPC는 바이너리 직렬화(Protocol Buffers)를 사용하는 대안으로, JSON보다 30~40% 더 콤팩트하고 연결이 불안정한 모바일 디바이스에서 더 빠릅니다. WebSocket은 디버깅 시 실시간 로깅에 사용되지만, 전력 소비로 인해 프로덕션에서는 거의 사용되지 않습니다.
Firebase Crashlytics는 크래시 리포트 및 커스텀 로그를 수집하는 Google의 무료 서비스입니다. Firebase SDK에 내장되어 있으며 별도의 서버가 필요하지 않습니다. Crashlytics는 크래시 시 스택 트레이스, 디바이스 상태, OS 버전 및 열려 있던 화면을 자동으로 수집합니다.
Crashlytics의 커스텀 로그는 log() 메서드를 통해 추가됩니다. 서버에 즉시 전송되지 않고 링 버퍼에 저장되었다가 다음 크래시 리포트에 첨부됩니다. 각 로그가 개별 이벤트인 Sentry와의 주요 차이점입니다. Crashlytics의 커스텀 로그 최대 용량은 크래시당 64KB입니다.
// Firebase Crashlytics — Android에서 커스텀 로그
import com.google.firebase.crashlytics.FirebaseCrashlytics
class CheckoutViewModel {
fun processPayment(amount: Double) {
FirebaseCrashlytics.getInstance()
.log("Payment started: amount=$amount")
try {
process(amount)
} catch (e: Exception) {
FirebaseCrashlytics.getInstance()
.recordException(e)
}
}
}
Firebase Crashlytics는 setUserIdentifier를 지원하여 크래시를 특정 사용자와 연결할 수 있습니다. 이를 통해 버그가 대규모인지 한 사용자에게만 영향을 미치는지 확인할 수 있습니다. setCustomKey는 각 리포트에 임의의 키(A/B 테스트 버전, 지역, 요금제)를 추가합니다.
Sentry는 크래시 리포트뿐만 아니라 모든 커스텀 이벤트(breadcrumbs)를 독립적인 레코드로 저장하는 오류 모니터링 플랫폼입니다. Crashlytics와 달리 Sentry는 오류 전 이벤트 시퀀스를 시간순으로 볼 수 있습니다. breadcrumbs는 크래시 로그에서 재구성할 필요 없이 인터페이스에 표시됩니다.
Sentry SDK는 시스템 이벤트에 대한 breadcrumbs를 자동으로 수집합니다: UIViewController 라이프사이클 변경(viewDidLoad, viewWillAppear), 터치, 버튼 누름, URLSession을 통한 HTTP 요청. 이러한 모든 이벤트는 커스텀 breadcrumbs와 함께 오류 타임라인에 표시됩니다. Android의 경우 Activity 및 Fragment 라이프사이클, onClick 이벤트 및 OkHttp를 통한 네트워크 요청이 유사하게 수집됩니다.
iOS 및 Android용 Sentry SDK는 UI 이벤트(터치, 내비게이션, 라이프사이클)의 breadcrumbs를 자동으로 수집합니다. 개발자는 addBreadcrumb()를 통해 유형, 카테고리 및 레벨을 지정하여 커스텀 breadcrumbs를 추가할 수 있습니다. Sentry는 분산 추적을 지원하며, 로거는 클라이언트 측 breadcrumbs를 추적 ID를 통해 백엔드 요청과 연결합니다.
import Sentry
func trackCartEvent(action: String, itemId: String) {
let crumb = Breadcrumb()
crumb.level = .info
crumb.category = "cart"
crumb.message = "Cart \(action): \(itemId)"
crumb.data = ["action": action, "item_id": itemId]
SentrySDK.addBreadcrumb(crumb)
}
Logcat은 Android Debug Bridge(ADB)를 통해 액세스할 수 있는 Android의 표준 로깅 시스템입니다. Logcat은 모든 시스템 및 애플리케이션 메시지를 레벨(V, D, I, W, E, F)과 태그별로 구성하여 수집합니다. Logcat에 대한 원격 액세스는 USB 또는 Wi-Fi를 통한 ADB로 작동하지만, 디버그 모드의 디바이스에만 해당됩니다. USB 연결이 없는 디바이스의 프로덕션 애플리케이션은 액세스할 수 없습니다.
Android 프로덕션 환경에서 원격 로깅을 위해 대안이 사용됩니다: Logcat 자체는 서버에 로그를 전송할 수 없습니다. 그 역할은 로컬 진단입니다. 그러나 익숙한 Log.d / Log.e API를 유지하면서 Firebase 또는 Sentry로 메시지를 전달하는 래퍼(Timber, LogcatLive)가 존재합니다. Timber는 애플리케이션 코드를 변경하지 않고 핸들러를 전환할 수 있습니다. 디버그 트리는 Logcat에 쓰고, 릴리스 트리는 배칭 및 압축을 수행하여 서버로 전송합니다.
배칭 (Batching)은 트래픽과 배터리를 절약하기 위해 여러 로그를 단일 HTTP 요청으로 그룹화하는 것입니다. 50개의 개별 POST 요청 대신 SDK가 하나의 JSON 배열을 전송합니다. 일반적인 전략: 스케줄 전송(30초마다), 개수 기준(50개 이벤트마다), 또는 이벤트 기준(중요 오류 시에만)입니다.
수백만 사용자의 애플리케이션에서는 로그 볼륨이 하루 테라바이트에 달할 수 있습니다. 배칭은 요청 수를 10~50배 줄이고 서버 부하를 감소시킵니다. Sentry는 전송 레벨에서 gzip 압축을 사용하여 데이터 볼륨을 추가로 60~70% 줄입니다.
// Android에서 간단한 배칭 구현
class LogBatcher {
private val buffer = mutableListOf<LogEvent>()
private val maxSize = 50
private val intervalMs = 30_000L
fun append(event: LogEvent) {
buffer.add(event)
if (buffer.size >= maxSize) flush()
}
suspend fun flush() {
val batch = buffer.toList()
buffer.clear()
sendToServer(batch)
}
}
gzip은 로그 HTTP 전송의 표준 압축 방법입니다. Sentry 및 Crashlytics SDK는 전송 전에 요청 본문을 자동으로 압축합니다. 중복 제거는 클라이언트 측에서 중복 메시지를 제거합니다: 동일한 이벤트가 초당 100회 발생하면 SDK가 count = 100 필드와 함께 한 번만 전송합니다.
가장 흔한 실수는 민감한 데이터 로깅입니다. Remote logging SDK는 서버로 데이터를 전송하며, 개발자가 실수로 비밀번호, 토큰 또는 사용자 이메일을 로깅하면 이 데이터가 클라우드 인프라에 저장됩니다. 항상 SDK 수준에서 PII(개인 식별 정보) 필터링을 사용하세요. Sentry에는 전송 전에 데이터를 정리하는 내장 beforeSend 훅이 있습니다.
두 번째 일반적인 문제는 과도한 로깅입니다. 모든 손가락 움직임이 서버로 전송되면 데이터 볼륨이 기하급수적으로 증가하고 서버 비용도 증가합니다. 로깅 예산을 설정하세요: 프로덕션에서 사용자 분당 1~5개 이벤트를 초과하지 않도록 합니다. 디버그 로그는 특정 디바이스에서만 활성화되는 플래그로 전송합니다.
세 번째 실수는 오프라인 시나리오 무시입니다. SDK가 네트워크 부재 시 로그를 손실하고 재연결 시 복원하지 않으면, 연결이 불안정한 사용자에게 remote logging은 무용지물입니다. 모든 SDK(Firebase, Sentry)는 자동으로 로그를 로컬 파일에 캐시하고 네트워크 사용 가능 시 전송하지만, 이 설정을 확인해야 합니다.
자주 묻는 질문
Crash reporting은 애플리케이션 크래시에 대한 정보만 수집합니다. Remote Logging은 커스텀 로그, breadcrumbs, 성능 메트릭, UI 이벤트 등 모든 이벤트를 수집합니다. Crash reporting은 remote logging의 하위 집합이지 대안이 아닙니다.
Crashlytics는 무료이며 기본 크래시 리포트에 충분합니다. breadcrumbs, 분산 추적, 커스텀 대시보드 및 유연한 알림이 필요하다면 Sentry가 더 좋습니다. 규정 준수 요구사항이 있는 엔터프라이즈 프로젝트의 경우 Sentry는 셀프 호스팅 버전으로도 사용 가능합니다.
로깅 레벨을 사용하세요: isDebuggable 플래그를 통해 개발자 디바이스에서만 debug/info 로그를 전송합니다. beforeSend 훅으로 다른 레벨(warn, error)을 필터링하고 PII가 포함된 필드를 제거합니다. 세션당 최대 로그 크기를 정의합니다.
Logcat은 서버로의 원격 전송을 지원하지 않습니다. Android에서 remote logging을 위해 Timber를 사용하여 Firebase 또는 Sentry로 전달하고, Logcat은 USB 디버깅용으로 남겨둡니다. Timber는 Android Log API를 대체하고 플랜터블 트리를 추가합니다.
디바이스 분당 50개 이벤트까지는 배칭(개별 전송이 아닌 배치 전송)을 사용하면 배터리 소비에 눈에 띄는 영향이 없습니다. 분당 200개 이상의 이벤트에서는 Wi-Fi/모뎀이 지속적으로 활성화되어 배터리가 15~25% 더 빨리 소모됩니다.
요약
턴키 방식의 모바일 애플리케이션을 개발해 드립니다
IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.