[iOS] 새로운 Logger API (iOS 14 이상)

Swiftios
avatar
2025.02.21
·
7 min read

이전에 printNSLog 대신 os_log를 사용해야 한다는 글을 쓴 적이 있다.

알고보니 iOS 14부터 새로운 Logger API를 지원하고 있었다.

이번 글에서는 Logger API의 장단점과 기존 로깅 방식 및 외부 라이브러리(CocoaLumberjack, OSLog)와의 비교를 정리한다.


Logger API란?

기존 로깅 방식과의 차이점

기존 iOS에서 로그를 출력하는 방식은 다음과 같다.

  • print(): 단순한 디버깅 용도로 사용되지만, 성능이 떨어지고 로그 관리가 어려움

  • NSLog(): 콘솔에 로그를 출력할 수 있지만, 성능 최적화 부족

  • OSLog(): iOS 10부터 도입된 로깅 프레임워크, 가독성이 떨어지고 사용이 어려움

Logger API 기본 사용법

Logger는 os.Logger 프레임워크를 기반으로 동작하며, 다음과 같이 사용한다.

import os

let logger = Logger(subsystem: "com.myapp.network", category: "API")

logger.log("API 요청을 시작합니다.")
logger.info("서버 응답: 성공")
logger.warning("네트워크 상태 불안정")
logger.error("서버 응답 실패")

출력 결과 (Xcode 콘솔)

[API] API 요청을 시작합니다.
[API] 서버 응답: 성공
[API] ⚠️ 네트워크 상태 불안정
[API] ❌ 서버 응답 실패

이전보다 가독성이 뛰어나며, 로그의 중요도를 쉽게 구분 가능하다.

Logger API의 주요 특징

1. 로그 레벨 지원

Logger API는 다양한 로그 레벨을 제공하여 중요도를 구분할 수 있다.

  • Xcode 콘솔에서 로그 필터링이 가능하여 특정 레벨의 로그만 확인할 수 있음

logger.debug("디버깅 정보")
logger.info("일반적인 정보")
logger.notice("중요한 정보")
logger.warning("경고 메시지")
logger.error("에러 발생")
logger.critical("치명적인 오류!")

2. Subsystem과 Category를 활용한 로그 분류

기존 print()나 NSLog()와 달리, Logger API는 로그를 체계적으로 관리할 수 있도록 Subsystem과 Category를 제공한다.

  • 로그를 모듈별로 구분하여 로그 분석이 쉬워짐

let networkLogger = Logger(subsystem: "com.myapp.network", category: "API")
let authLogger = Logger(subsystem: "com.myapp.auth", category: "Login")

3. Xcode 콘솔 및 디바이스 로그 분석 지원

Logger API는 Xcode 콘솔뿐만 아니라 디바이스에서 수집한 로그를 분석할 수 있다.

  • Console.app을 사용하면 iPhone에서 발생한 로그를 필터링하여 확인 가능

  • OSLogStore를 활용하면 특정 조건에 맞는 로그를 가져올 수도 있음

  • 앱이 크래시된 후에도 저장된 로그를 가져와 디버깅 가능

import OSLog

let logStore = try OSLogStore(scope: .currentProcessIdentifier)
let position = logStore.position(date: Date().addingTimeInterval(-600)) // 최근 10분 로그
let entries = try logStore.getEntries(at: position)

for entry in entries {
    print(entry)
}

Logger API의 장단점

장점

  • 성능 최적화: 기존 print()보다 성능이 뛰어나며, 메모리와 CPU 사용량을 줄일 수 있음

  • 필터링 지원: 로그 레벨을 활용하여 중요한 로그만 필터링 가능

  • 구조화된 로그 관리: subsytstem과 category를 활용하여 모듈별로 로그를 정리할 수 있음

  • Xcode 콘솔 & 디바이스 로그 분석 지원

단점

  • iOS 14 이상에서만 지원 (iOS 13 이하에서는 사용 불강)

  • 파일 저장 기능 없음 (별도의 파일로 저장하려면 추가 작업 필요)

  • 기본 제공 기능 외에 커스터마이징이 어려움

기존 로그 방식 및 외부 라이브러리와 비교

기능

print()

NSLog()

Logger API

OSLog

CocoaLumberjack

성능

느림

중간

빠름

빠름

중간

로그 필터링

없음

없음

지원

지원

지원

로그 저장

없음

일부 저장

없음

저장 가능

저장 가능

로그 레벨

없음

없음

지원

지원

지원

Subsystem
Category

없음

없음

지원

지원

지원

iOS 지원

모든 버전

모든 버전

iOS 14 이상

iOS 10 이상

모든 버전

Logger API 활용 예제

1. 앱의 주요 기능별로 로깅 적용하기

let networkLogger = Logger(subsystem: "com.myapp", category: "Network")
let dbLogger = Logger(subsystem: "com.myapp", category: "Database")

networkLogger.info("API 요청 시작")
dbLogger.error("데이터베이스 로드 실패")

2. 로그를 Xcode 콘솔에서 필터링하는 방법

Xcode의 Console Filter 기능을 사용하면 원하는 로그만 쉽게 확인 가능

  • subsystem == "com.myapp.network" → 네트워크 로그만 확인

  • category == "Database" → 데이터베이스 관련 로그만 확인







- 컬렉션 아티클