Console.app은 시스템 및 사용자 로그를 보고, 필터링하고, 분석하기 위한 macOS 내장 애플리케이션입니다. Apple의 통합 로깅 시스템(os_log)의 메시지를 실시간으로 표시하여 개발자가 Xcode에 연결하지 않고도 크래시, 오류 및 디버그 메시지를 볼 수 있습니다. Apple Support에 따르면 Console.app은 하위 시스템, 카테고리, 중요도 수준 및 프로세스별 필터링과 .logarchive로의 로그 내보내기를 지원합니다. 이는 Mac에서 문제를 진단하는 데 필수적인 도구입니다. 필터와 저장된 검색을 사용하면 수천 개의 시스템 메시지 중에서 애플리케이션 오류를 빠르게 찾을 수 있습니다.
핵심 요점
Console.app은 Apple의 통합 로깅 시스템의 그래픽 인터페이스입니다. 이전 Console 애플리케이션(macOS의 일부)을 대체했으며 os_log, os_trace 및 syslog API를 통해 기록된 모든 시스템 및 애플리케이션 로그에 대한 액세스를 제공합니다. Console.app은 모든 Mac의 /Applications/Utilities/에 있습니다.
Xcode가 IDE에서 실행한 애플리케이션의 로그만 표시하는 반면, Console.app은 시스템의 모든 프로세스 로그를 동시에 표시합니다. 이를 통해 Xcode 외부나 백그라운드에서 애플리케이션을 실행할 때만 발생하는 문제를 진단할 수 있습니다. Console.app은 커널, launchd, WindowServer 등의 시스템 로그도 표시하므로 저수준 문제를 디버깅하는 데 유용합니다.
Console.app은 추가 도구 설치나 인터넷 연결이 필요하지 않습니다. 모든 데이터는 .tracev3 데이터베이스에 로컬로 저장되며 애플리케이션은 완전히 오프라인에서 작동합니다. 다른 Mac이나 iOS 기기에서 로그를 보려면 log collect 명령을 사용한 후 .logarchive를 Console.app에서 엽니다.
Console.app 인터페이스는 필터가 있는 사이드바, 메시지 테이블, 선택한 메시지의 세부 정보 패널의 세 가지 주요 영역으로 구성됩니다. 사이드바에는 Devices(사용 가능한 로그 소스), Reports(시스템 크래시 리포트), Saved Searches(저장된 검색 쿼리) 섹션이 있습니다.
메시지 테이블에는 Time(타임스탬프), Category(카테고리), Level(중요도 수준 — 색상 코드), Process(프로세스 이름), Message(메시지 텍스트) 열이 있는 로그 목록이 표시됩니다. 메시지를 클릭하면 하위 시스템, 활동 식별자, 스레드 ID 및 전체 형식 텍스트가 표시되는 세부 정보 패널이 열립니다.
Console.app은 메시지를 색상으로 강조 표시합니다: Fault는 빨간색, Error는 노란색, Debug는 파란색, Info는 회색입니다. Default 메시지는 강조 표시되지 않습니다. 이를 통해 로그 스트림을 시각적으로 스캔하고 중요한 이벤트를 즉시 파악할 수 있습니다.
// Console.app에 표시될 로그
import OSLog
let logger = Logger(
subsystem: "com.example.myapp",
category: "network"
)
logger.error("Connection failed: timeout")
logger.debug("Retry attempt 3 of 5")
// 이 메시지는 필터 'myapp'을 적용한 Console.app에서 볼 수 있습니다
필터링은 Console.app의 주요 기능으로, 초당 수천 개의 메시지 스트림을 읽을 수 있는 목록으로 변환합니다. 상단의 검색 필드는 AND 조건을 지원합니다: 공백으로 구분된 여러 단어는 모든 단어를 포함하는 메시지만 표시합니다. 예를 들어, myapp error는 Error 수준의 myapp 애플리케이션의 모든 로그를 표시합니다.
사이드바의 하위 시스템 필터에서는 하나 이상의 하위 시스템을 선택할 수 있습니다. 이것은 시스템 메시지에서 특정 애플리케이션의 로그를 분리하는 가장 빠른 방법입니다. 카테고리 필터는 하위 시스템을 선택한 후 사용할 수 있으며 선택한 애플리케이션에서 사용하는 모든 카테고리를 표시합니다. 수준 필터는 중요도 수준에 따라 메시지를 제한합니다: 오류만 또는 디버그 메시지만 표시할 수 있습니다.
| 필터 유형 | 예시 | 결과 |
|---|---|---|
| 텍스트 | crash payment | crash와 payment를 모두 포함하는 메시지 |
| Subsystem | com.example.myapp | 지정한 애플리케이션의 로그만 |
| Level | Error + Fault | 오류 및 심각한 장애만 |
| Category | network | network 카테고리의 메시지 |
| 시간 | 지난 1시간 | 선택한 간격의 메시지만 |
Console.app의 검색 필드는 REGEX:pattern 구문을 통해 정규 표현식을 지원합니다. 예시: REGEX:error.*tim(e|out)은 “error”를 포함하고 “tim”으로 시작하며 “e” 또는 “out”로 끝나는 단어가 포함된 모든 메시지를 찾습니다. 정규 표현식은 검색 필드에서만 작동하며 하위 시스템이나 카테고리 필터에서는 작동하지 않습니다.
Live는 Console.app이 커널 링 버퍼에 새 메시지가 나타나는 즉시 표시하는 실시간 모드입니다. 이 모드는 기본적으로 활성화되어 있으며 실행 중인 애플리케이션을 디버깅하는 데 적합합니다: 애플리케이션을 실행하면 1~5초 지연으로 로그가 표시됩니다. Live 버튼(또는 ⌘L)으로 스트림을 켜고 끕니다.
Historical은 아카이브 보기 모드입니다. Console.app은 지난 7~14일(시스템에서 구성 가능)의 모든 메시지를 .tracev3 데이터베이스에 저장합니다. Historical 모드는 이 아카이브를 열고 현재 스트림뿐만 아니라 모든 필터를 사용하여 검색할 수 있습니다. 이는 밤중이나 애플리케이션이 Mac에 연결되지 않고 실행 중일 때 발생한 문제를 분석하는 데 필수적입니다.
모드 전환은 도구 모음의 Live 버튼을 통해 이루어집니다. Live가 꺼져 있으면 Console.app이 기록 데이터를 표시합니다. 이 모드에서는 캘린더나 ← → 버튼을 사용하여 타임라인을 탐색할 수 있습니다. Historical 데이터는 디스크에 저장된 로그에만 사용 가능하며 링 버퍼에서 덮어쓰여진 메시지는 아카이브에 포함되지 않습니다.
Console.app은 필터링된 로그를 여러 형식으로 내보낼 수 있습니다. File → Export → Save에서 형식을 선택할 수 있습니다: .logarchive(Apple 기본 형식, 모든 메타데이터 포함), .txt(열이 있는 일반 텍스트), .json(필드가 있는 구조화된 데이터). 버그 리포트에 첨부하려면 .logarchive를 사용하세요. 모든 Mac의 Console.app에서 열 수 있습니다.
iOS 기기에서 내보내기: Xcode(Devices → Open Console)를 통해 또는 터미널에서 log collect --device --output ./archive.logarchive 명령을 사용하여 수행합니다. 결과 .logarchive를 Mac의 Console.app에서 열면 원격 기기의 로그가 표시되지만 필터와 검색은 로컬 로그와 동일하게 작동합니다.
// 터미널을 통한 iOS 기기 로그 내보내기
// log collect --device --output ./ios_crash.logarchive
// log show --subsystem com.example.app --last 1h --output json
// 예시: 지난 1시간 로그 내보내기
// log show --predicate 'subsystem == "com.example.myapp"' \
// --info --debug --last 1h --output json > logs.json
// Swift에서 내보낸 로그 파싱
let jsonData = try Data(contentsOf: URL(fileURLWithPath: "logs.json"))
let decoded = try JSONDecoder()
.decode([LogEntry].self, from: jsonData)
.logarchive는 동료에게 보내거나 JIRA 티켓에 첨부하기에 최적의 형식입니다. 파일에는 메시지뿐만 아니라 하위 시스템, 카테고리, 타임스탬프, 스레드 ID 및 모든 메타데이터가 포함됩니다. .tracev3 압축 덕분에 아카이브 크기는 원시 로그보다 훨씬 작습니다. 보내기 전에 로그에 개인 데이터가 없는지 확인하세요: 애플리케이션의 하위 시스템으로 필터를 사용하여 다른 프로세스의 기밀 정보를 포함할 수 있는 시스템 로그를 제외합니다.
Xcode 없이 크래시 진단: 애플리케이션이 Xcode 외부에서 시작될 때 크래시되면 Console.app이 프로세스의 Fault 메시지를 표시합니다. 사이드바에서 Reports → Crash Reports를 찾으세요 — 서명 및 스택이 포함된 전체 크래시 리포트가 표시됩니다. 애플리케이션의 하위 시스템 필터를 사용하고 수준을 Error+Fault로 설정하여 크래시 전의 모든 중요 이벤트를 확인합니다.
Console.app을 사용하면 타임스탬프를 통해 애플리케이션의 지연을 추적할 수 있습니다. 두 관련 메시지(예: “요청 전송”과 “응답 수신”) 사이에 예상보다 더 많은 시간이 경과한 경우 성능 문제의 신호입니다. Default 수준의 애플리케이션 하위 시스템 필터는 밀리초 단위의 정확도로 모든 주요 이벤트를 표시합니다.
메모리 누수 찾기: 메모리 누수가 발생하면 시스템이 memory 카테고리와 Error 수준으로 os_log를 통해 메모리 경고를 보냅니다. Console.app에서 memory 단어로 필터링하고 하위 시스템을 선택합니다. 경고가 5~10초마다 반복되면 애플리케이셩메모리를 적극적으로 소비하고 있는 것입니다. 할당을 추적하기 위해 Debug 로그를 활성화할 수도 있습니다.
네트워크 요청 디버깅: 애플리케이션이 네트워크 이벤트에 os_log를 사용하는 경우 Console.app은 모든 요청과 응답을 시간과 함께 표시합니다. category=network 필터로 노이즈를 줄입니다. 요청과 응답 사이의 시간이 예상을 초과하면 level=Error 메시지를 찾으세요 — 타임아웃 또는 DNS 오류를 나타냅니다.
// Console.app JSON 로그 파싱을 위한 구조
struct LogEntry: Codable {
let timestamp: String
let eventMessage: String
let subsystem: String
let category: String
let messageType: UInt8
var level: String {
switch messageType {
case 1: return "Fault"
case 16: return "Error"
case 17: return "Debug"
default: return "Default"
}
}
}
자주 묻는 질문
Console.app은 /Applications/Utilities/ 폴더에 있습니다. Spotlight(⌘스페이스 → Console) 또는 Finder → 응용 프로그램 → 유틸리티 → Console을 통해 열 수 있습니다. 앱 아이콘은 기어가 있는 스타일화된 말풍선입니다.
os_log는 기본적으로 문자열과 객체를 private으로 마스킹합니다. Console.app은 프로덕션 모드에서 이를 <private>으로 표시합니다. 실제 값을 보려면 Xcode에서 애플리케이션을 실행하거나 하위 시스템에 대해 Debug 수준의 수집 프로필을 활성화합니다.
Console.app 사이드바에서 Devices → 기기 → Processes 섹션에서 하위 시스템(com.example.app)을 선택합니다. 또는 검색 필드에 프로세스 이름을 입력하고 드롭다운 목록에서 Process: YourApp을 선택합니다.
기본적으로 macOS는 사용 가능한 디스크 공간에 따라 .tracev3에 로그를 7~14일 동안 저장합니다. 공간이 부족하면 가장 오래된 로그부터 자동으로 삭제됩니다. sudo log config를 통해 보존 기간을 늘릴 수 있지만 프로덕션 머신에서는 권장되지 않습니다.
네, iOS 기기를 USB로 Mac에 연결하고 Xcode → Devices를 열어 기기를 선택한 후 Open Console을 클릭합니다. Console.app이 연결된 기기의 로그를 실시간으로 표시합니다. 오프라인 수집을 위해서는 터미널에서 --device 플래그와 함께 log collect를 사용합니다.
요약
턴키 방식의 모바일 애플리케이션을 개발해 드립니다
IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.