Xcode의 Console: 주요 개념, 데이터 출력 및 디버깅

저자: IT Sectr 게시일: 2026-05-06 읽는 시간: 8 분

Xcode의 Console은 NSLog, print, os_log 출력 및 앱 크래시 로그를 실시간으로 표시하는 iOS 개발용 디버깅 도구입니다. Apple Unified Logging에 따르면, iOS 10부터 Apple은 Unified Logging System을 통한 중앙 집중식 메시지 수집을 위해 NSLog 대신 os_log 사용을 권장합니다. Console은 디버거 출력과 시스템 메시지를 단일 Debug Area 창에 통합하여 개발 중 언제든지 액세스할 수 있습니다.

주요 포인트

  • Console Xcode — Debug Area에서 NSLog, os_log, print 및 iOS 앱 크래시 로그를 보는 창
  • Unified Logging System — 카테고리, 레벨 및 디스크 저장을 갖춘 Apple의 최신 로깅 시스템
  • os_log — 동적 레벨 구성을 지원하는 권장 로깅 API
  • 크래시 로그는 기기나 시뮬레이터에서 앱이 크래시되면 자동으로 Console에 표시됩니다
  • 중단점 로그 — Debugger Command를 통해 실행을 중단하지 않고 Console에 메시지 출력

Xcode에서 Console이란

Console은 Xcode에서 Debug Area의 일부로, 편집기 하단 패널에 있습니다(View → Debug Area → Activate Console, 단축키 Cmd + Shift + Y). Console은 실행 중인 앱의 모든 텍스트 출력(NSLog, os_log, print 메시지, 런타임 경고, 앱 크래시 시 자동 예외 덤프)을 표시합니다.

Console은 시뮬레이터와 물리적 기기 모두에서 작동합니다. 시뮬레이터에서는 메시지가 로컬 파이프를 통해 즉시 도착하고, 기기에서는 USB 연결을 통해 1~3프레임 지연으로 도착합니다. 프로덕션 앱의 경우 기기에서 Console을 사용할 수 없습니다 — 개발자는 Crashlytics 또는 log collect를 통한 원격 수집이 포함된 Unified Logging에 의존합니다.

Mac의 시스템 Console.app과 달리, Xcode의 Console 창은 현재 실행 중인 앱의 로그만 표시합니다(필터링 기능 포함). Console.app은 iOS 시뮬레이터를 포함한 Mac의 모든 프로세스 로그를 수집합니다. 그러나 iOS 앱 디버깅을 위해 개발자는 LLDB 디버거와의 통합으로 인해 내장된 Xcode Console을 사용합니다.

로깅 API: NSLog, os_log 및 print

세 가지 주요 API가 iOS 개발자에게 Console 출력을 위해 제공됩니다: NSLog(구식), os_log(권장), print(Swift 전용). 각각 성능, 형식 지정 및 Unified Logging System과의 호환성 측면에서 고유한 특성을 가지고 있습니다.

NSLog — 클래식 로깅

NSLog는 Foundation의 함수로, Objective-C와 Swift에서 사용할 수 있습니다. NSLog는 타임스탬프, 프로세스 이름 및 PID와 함께 메시지를 출력합니다. 단점: NSLog는 동기적으로 시스템 버퍼에 쓰며, 쓰는 동안 현재 스레드를 차단합니다. 빈번한 호출(예: 루프 내)에서 NSLog는 눈에 띄는 지연을 만듭니다. Apple은 새 프로젝트에 NSLog를 권장하지 않지만, 레거시 코드 및 타사 라이브러리와의 호환성은 유지됩니다.

os_log — 현대 표준

os_log는 iOS 10에서 도입된 os.framework의 API입니다. os_log는 비동기식입니다. 메시지는 대기열에 추가되고 호출 스레드를 차단하지 않고 버퍼에 기록됩니다. WWDC 2016에 따르면, os_log는 고부하 시나리오에서 NSLog보다 50배 빠릅니다. os_log는 동적 제어도 지원합니다. DEBUG 수준 메시지는 Debug 빌드에서만 수집되고 Release에서는 오버헤드 없이 무시됩니다.

print() — Swift 전용 출력

print()는 Swift에서 가장 간단한 출력 방법입니다. print는 stdout(표준 출력)에 쓰며, Xcode가 이를 Console로 리디렉션합니다. print는 메타데이터(시간, 수준)를 추가하지 않지만 stdout 버퍼링을 지원합니다. 빠른 디버깅을 위해 print는 편리한 도구이지만, 영구 로깅을 위해서는 기능과 제어 측면에서 os_log에 미치지 못합니다.

swift
import os.log

// NSLog — 구식, 차단
NSLog("Application started")

// os_log — 권장, 비동기
let log = OSLog(
    subsystem: "com.myapp",
    category: "lifecycle"
)
os_log("Application started", log: log)

// print — 빠른 Swift 출력
print("Application started")

Unified Logging: 카테고리, 레벨 및 하위 시스템

Unified Logging System(ULS)은 iOS 10 및 macOS Sierra에서 도입된 Apple의 종단 간 로깅 인프라입니다. ULS는 모든 시스템 프로세스의 메시지를 단일 저장소에 수집하며, Mac의 log 명령줄 도구를 통해 원격 액세스가 가능합니다. 개발자는 ULS에 쓰기 위해 os_log를, 읽기를 위해 Console을 사용합니다.

하위 시스템 및 카테고리

OSLog는 subsystem(예: com.myapp.network)과 category(예: http, websocket) 쌍으로 식별됩니다. 하위 시스템은 애플리케이션 도메인입니다(하나의 앱은 다른 모듈에 대해 여러 하위 시스템을 가질 수 있습니다). 카테고리는 하위 시스템 내의 구성 요소입니다. subsystem + category 조합을 통해 Console 및 log collect에서 유연한 로그 필터링이 가능합니다.

OSLog 로깅 레벨

레벨OSLogTypeConsole 표시Release 수집
Default.default항상
Info.infoos_log UI 활성화 시
Debug.debugDebug 빌드 전용아니요
Error.error항상 빨간색 레이블
Fault.fault항상 보라색 레이블

log collect — 원격 로그 수집

Mac의 log collect 명령은 연결된 iOS 기기에서 보관된 로그를 .logarchive 파일로 수집합니다. 이 파일은 Mac의 Console.app에서 열어 os_log 메시지, 크래시 로그 및 시스템 진단을 포함한 자세한 분석을 할 수 있습니다. 기기에서 수집을 활성화하려면 개발자 모드를 활성화하고 USB로 기기를 연결해야 합니다.

Console 작업: 단계별 디버깅 및 크래시 로그 분석

Console을 사용한 실제 작업에는 개발 중 활성 로깅, 크래시 후 크래시 로그 분석, .logarchive를 통한 원격 진단의 세 가지 주요 시나리오가 포함됩니다. 각 시나리오에는 최적의 도구 및 설정 세트가 있습니다.

개발을 위한 Console 설정

각 애플리케이션 모듈에 대해 debug(상세 디버깅), info(주요 상태 전환), error(예외 및 실패) 수준으로 별도의 OSLog를 만들것을 권장합니다. Xcode Console에서 애플리케이션의 하위 시스템별로 필터링을 활성화하여 노이즈를 만들고 앱 로직에서 주의를 산만하게 하는 시스템 메시지를 제외합니다.

크래시 로그 분석

앱이 크래시되면 Xcode가 자동으로 실행을 중지하고 Console에 전체 스택 추적과 함께 크래시가 발생한 스레드를 표시합니다. 크래시 로그의 첫 번째 줄에는 예외 유형(NSException, EXC_BAD_ACCESS)과 이유가 포함됩니다. 스택 추적을 아래에서 위로 살펴보세요. 마지막으로 호출된 메서드가 크래시 위치입니다. 암호화된 주소(Release)의 경우 dSYM을 통한 심볼리케이션이 필요합니다.

swift
// OSLog 모듈식 설정 예제
extension OSLog {
    static let uiLifecycle = OSLog(
        subsystem: "com.myapp.ui",
        category: "lifecycle"
    )
    static let network = OSLog(
        subsystem: "com.myapp.network",
        category: "http"
    )
    static let database = OSLog(
        subsystem: "com.myapp.data",
        category: "core-data"
    )
}

// 레벨과 함께 사용
os_log("View did load", log: .uiLifecycle, type: .debug)
os_log("HTTP 200 received", log: .network, type: .info)
os_log("Failed to save: \(error.localizedDescription)",
    log: .database, type: .error)

고급 기능: 중단점 로그 및 사용자 정의 형식

Xcode Console은 단순한 로깅을 넘어 여러 고급 기능을 지원합니다. 중단점 로그를 사용하면 실행을 중단하지 않고 Console에 메시지를 출력할 수 있으며, Debugger Command의 LLDB 명령은 출력 형식 지정을 완전히 제어할 수 있습니다.

중단 없는 중단점 로그

Console에 메시지를 출력하고 자동으로 실행을 계속하도록 중단점을 구성할 수 있습니다. 원하는 줄에 중단점을 설정하고, 마우스 오른쪽 버튼 클릭 → Edit Breakpoint → Debugger Command 추가: “po self” 또는 “expr @import UIKit” + Debugger Command: “po self.view”. Automatically continue after evaluating을 선택합니다. 시작 후 중단점은 줄에 도달할 때마다 명령 결과를 Console에 출력하며 스레드를 중단하지 않습니다.

Console의 LLDB 명령

Xcode Console은 중단점에서 멈춰 있는 동안 임의의 LLDB 명령 실행을 지원합니다. po(print object)는 객체 설명을 출력하고, p(print)는 기본 값을 출력하며, expr은 Swift/ObjC 표현식을 실행합니다. 형식화된 출력을 위해 p/CGRectGetWidth를 사용합니다. LLDB 출력은 중단점에 도달하면 즉시 Console에 나타납니다.

swift
func processUserData(user: User) {
    // Debugger Command가 있는 중단점:
    // po "User name: \(user.name)"
    // expr user.age = 30
    print("Processing user: \(user.name)")
}

// 시퀀스를 사용한 사용자 정의 로깅 예제
func trackMethodCall(
    file: String = #file,
    function: String = #function
) {
    os_log("[\(function)] called",
        log: .uiLifecycle, type: .debug)
}

Instruments와 통합

Xcode Console은 Xcode의 프로파일링 도구인 Instruments와 긴밀하게 통합되어 있습니다. Product → Profile을 통해 Logging 템플릿으로 앱을 실행하면 모든 os_log 메시지가 타임스탬프와 함께 Instruments 트레이스에 기록됩니다. 이를 통해 단일 타임라인에서 로그, 성능 및 시스템 이벤트를 동시에 볼 수 있으며, 경합 조건 및 성능 저하 진단에 중요합니다.

자주 묻는 질문

NSLog와 os_log의 차이점은 무엇인가요?

NSLog는 동기식이며 스레드를 차단하고 항상 메시지를 출력합니다. os_log는 비동기식이며 고부하 시나리오에서 50배 빠르고, 카테고리를 지원하며 성능 저하 없이 Release 빌드에서 디버그 수준을 동적으로 비활성화합니다.

Console이 앱의 os_log를 표시하지 않는 이유는 무엇인가요?

로깅 수준을 확인하세요: 기본적으로 Console은 default 이상만 표시합니다. info 및 debug를 보려면 Xcode Console에서 os_log 메뉴를 열고 스킴 설정에서 Include Info Messages 및 Include Debug Messages를 선택합니다(Edit Scheme → Run → Arguments → OS_ACTIVITY_MODE = debug).

공유를 위해 Console 로그를 파일로 저장하는 방법은?

Console에서 원하는 메시지를 선택하고 복사(Cmd + C)하여 텍스트 편집기에 붙여넣습니다. 전체 덤프를 위해 터미널 명령을 사용하세요: sudo log collect --device --output /tmp/app_logs.logarchive — iOS 기기에서 모든 로그를 구조화된 형식으로 저장합니다.

Release 빌드에서 os_log를 활성화하는 방법은?

os_log 유형 .default 및 .error는 기본적으로 Release에서 작동합니다. Release에서 .info 및 .debug를 사용하려면 Xcode 스킴에 시작 인수 -OSLogPreferencesApp “$(PRODUCT_BUNDLE_IDENTIFIER):debug”를 추가해야 합니다. 이 인수가 없으면 디버그 메시지가 Release에서 수집되지 않아 기기 리소스를 절약합니다.

기록에서 특정 크래시 로그를 찾는 방법은?

Xcode에서 Window → Organizer → Crashes를 여세요. 오거나이저는 예외 유형별로 그룹화된 테스터 기기에서 수집된 모든 크래시 로그를 표시합니다. 심볼리케이션에는 크래시가 발생한 빌드의 .dSYM 파일이 필요합니다 — Xcode는 아카이브가 있으면 자동으로 찾습니다.

요약

  • Console Xcode — Debug Area에서 NSLog, os_log, print 및 크래시 로그를 보는 내장 도구
  • os_log — 비동기 쓰기, 카테고리 및 Unified Logging System 지원을 갖춘 권장 API
  • Unified Logging은 모듈식 로그 구성을 위한 하위 시스템과 카테고리 제공
  • 중단점 로그는 앱 실행을 중단하지 않고 Console에 메시지 출력
  • LLDB 명령 po, p, expr은 콘솔 출력 형식을 완전히 제어
  • 크래시 로그 분석은 Console의 예외에서 시작되며 Release의 경우 dSYM을 통한 심볼리케이션 필요
  • Instruments와 통합으로 단일 타임라인에서 로그와 프로파일링 결합 가능

턴키 방식의 모바일 애플리케이션을 개발해 드립니다

IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.

프로젝트 논의

더 읽어보기