YunDaeHyeon
← Lab

시스템 로그함수

스터디2025.07.15
  • Swift
  • Xcode

시스템 로그 함수

다양한 디버깅 방법이 존재하지만, 그 중에서도 print()문은 가장 쉽고 빠른 디버깅 수단인 것 같습니다.

언제 어디서든 간편하게 문자열이나 변수들의 값을 콘솔에서 바로 출력할 수 있다는 것은 큰 특징 중 하나입니다.

빠르고 직관적인 print문은 그와 대비되는 여러 제한점이 존재합니다.


🤔 print문의 특징과 단점

developer.apple.com/documentation/swift/print(_:separator:terminator:

developer.apple.com/documentation/swift/print(_:separator:terminator:

www.appypievibe.ai/blog/swift-code/print-swift-how-to

  • 특징
  • print문은 언제 어디서든 간편하게 원하는 값을 콘솔에서 출력시킬 수 있습니다.
  • 매우 직관적이며 별도의 설정 없이 바로 사용할 수 있습니다.
  • 런타임 중 변수의 값이나 함수의 실행 흐름을 간접적으로나마 간단하게 추적할 수 있습니다.

다만, 릴리즈 관점, 성능, 보안의 측면으로 바라본 print문은 제한 사항이 다소 존재합니다.

  • 단점
  • print문은 Release 빌드 시에도 출력되어 보안과 성향에 안좋은 영향을 미칩니다.
  • 로그 레벨의 구분이 불가능합니다.
  • print문의 결과를 따로 저장하거나 필터링, 분석할 수 없습니다.
  • 즉, 시스템 레벨의 로그 관리가 불가능합니다!
  • 외부 프로그램에서는 로그를 확인할 수 없으며 오직 Xcode 콘솔에서만 출력을 확인할 수 있습니다.

iOS/Swift 공식 시스템 로그 함수 종류

Logger | Apple Developer Documentation

Logger | Apple Developer Documentation

Logging | Apple Developer Documentation

Swift Logging Techniques: A Complete Guide to iOS Logging | Bugfender

Swift Logging Techniques: A Complete Guide to iOS Logging | Bugfender

[iOS - swift] os_log, Logger, 통합 로깅 시스템 (unified logging system)

print와 같이 시스템의 로그를 출력해볼 수 있는 주요 함수들은 아래와 같습니다.

CocoaLumberjack, Bugfender, NSLogger, SwiftLog 등 서드파티 로깅 프레임워크는 제외하였습니다.

로그 함수주요 특징
print기본값, 콘솔에서만 확인
NSLog날짜/시간과 함께 로그 출력
os_log로그 레벨/서브시스템/카테고리 설정
LoggeriOS 14이상 공식 권장, 구조화 로그 지원

1. print

print("Debug 메세지"
print("ID : \(user.id)")
  • 장점
  • print문은 직관적이며 단순합니다.
  • 또한 원하는 값을 바로 확인할 수 있습니다.
  • 단점
  • 다만, 체계적인 로그 관리가 불가능합니다.
  • 중요한 정보가 쉽게 노출될 수 있습니다.
  • print문은 실행 시마다 I/O가 자주 발생합니다. 그러다보니 자주 호출되면 앱 자체의 성능을 눈에 띄게 떨어뜨릴 수 있습니다.
  • Swift의 컴파일러는 print 문이 포함된 스코프를 최적화하지 못하게 합니다. 그러다보니 불필요한 코드가 릴리즈 빌드에 포함될 수 있습니다.
  • 정보 출처 : https://stackoverflow.com/questions/28738943/does-print-println-slow-execution

2. NSLog

NSLog("에러가 발생했습니다. %@", "네트워크에 연결되어있지 않습니다.")

NSLog는 날짜와 시간(타임스탬프) 과 함께 로그를 출력하기에 용이합니다.

  • 장점
  • 날짜/시간과 로그를 파일로 남길 수 있습니다.
  • 반환값이 없으며 로그 레벨의 구분이 불가능합니다.

3. os_log (iOS 10+)

import os.log
os_log("기본 로그 메시지", log: .default, type: .info)
os_log("디버그 메시지: %{public}@", log: .default, type: .debug, "Network Response: Success")

os_log는 Logger가 출시되기 전 가장 많이 사용된 로그 함수입니다.

대표적으로 로그 레벨의 구분이 가능하며 서브 시스템, 카테고리, 개인정보 보호 등 다양한 기능을 사용할 수 있습니다.

  • 장점
  • 로그 레벨을 지정할 수 있습니다.
  • 서스시스템 및 카테고리 구분이 가능합니다.
  • 개인 정보를 쉽게 보호할 수 있습니다.
  • 단점
  • 사용법이 약간 상대적으로 복잡합니다.

4. Logger (iOS 14+)

Apple에서 iOS 14 이상의 버전에서 공식적으로 사용할 것을 권장하는 함수입니다.

os_log를 더 직관적으로 변경했다고.. 이해하면 편할 것 같습니다.

import os
let logger = Logger(subsystem: "com.example.app", category: "network")
logger.debug("네트워크 요청 시작")
logger.info("유저 수: \(userCount)")
logger.error("네트워크 에러 발생")


Logger에 대해 알아보기

Swift 5+ 및 iOS 14 이상 버전에서 공식적으로 지원하는 Logger 에 대해 알아보겠습니다.

Logger는 os_log의 상위 호환이며, 로그를 서브 시스템, 카테고리, 레벨 로 체계적으로 분류할 수 있습니다.

또한, 개인정보 보호 등의 기능이 내장되어있어 민감한 정보를 쉽게 캡슐화시켜 디버깅을 수행하거나 로그를 남길 수 있습니다.

사용법은 간단합니다.

사용하고자 하는 모듈이나 파일에 os를 import 하면 됩니다.

import os

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

이때 subsystem은 주로 앱 번들 ID를 입력합니다.

카테고리는 로그를 분류할 수 있는 짧은 문자열이지만 주로 로그를 출력하는 파일의 이름을 입력합니다.

위처럼 생성한 logger 인스턴스를 통해 레벨별 로그를 출력시킬 수 있습니다.

logger.debug("디버그 정보")
logger.info("정보성 메시지")
logger.notice("중요 알림")
logger.warning("경고 메시지")
logger.error("에러 발생")
logger.fault("심각한 버그 발생")

logger로 출력시킨 로그들은 Xcode 콘솔이 아닌 Console.App에서 확인이 가능합니다.

또한 로그 프라이버시 옵션을 통해 민감한 값들을 로그에 포함하지 않게하여 릴리즈 환경에서 자동으로 보호할 수 있습니다!

logger.info("유저 이름: \(user, privacy: .private)")
logger.info("공개값: \(id, privacy: .public)")