• Feed
  • Explore
  • Ranking
/
/
    📱 iOS

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

    Swiftios
    지
    지성
    2025.02.21
    ·
    7 min read

    이전에 print나 NSLog 대신 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" → 데이터베이스 관련 로그만 확인







    - 컬렉션 아티클