OSLog 사용해보기

peppermint100
PEPPERMINT100
Published in
5 min readAug 20, 2024

서론

올해 초 F-lab에서 멘토님께 코드리뷰 받을 때 print문 대신 NSLog를 사용해보는게 어떻느냐는 제안을 받았었다. 사실 디버깅용으로 콘솔에 출력하고 현재 프로세스가 어디를 지나고 있는지 잘되고 있는지 확인하기 위해 적절한 포인트에 print문을 넣었었는데, Log를 사용하는 방향이 좋다고 한다.

다만 그 당시에 피드백 받았던 NSLog는 조금 오래된 Log API로 로그 당시의 타임 스탬프, 프로세스이름, 스레드 등을 출력해준다.

하지만 OSLog는 iOS 10 이후에 도입된 비교적 최신 로깅 API로 즉시 출력되지 않고 필요한 경우에만 시스템에 의해 처리되어 효율적이고 privacy 옵션을 사용하여 민감한 정보를 마스킹하여 보안에도 좋다.

또 로그의 구조화를 지원하여 Xcode Instrument를 레벨별로 로그를 필터링하거나 중요한 로그만을 수집하도록 하여 조금 더 용이한 분석이 가능하다.

OSLog

이러한 OSLog를 사용하려면

import OSLog

// 로그를 기록할 로거 인스턴스 생성
let logger = Logger(subsystem: "com.example.yourapp", category: "network")

logger.info("This is an info message.")
logger.debug("This is a debug message with a variable: \\(42).")
logger.error("An error occurred: \\(error.localizedDescription).")

이런식으로 사용할 수 있는데

여기서 subsystem은 앱의 번들ID를 넣어 로깅의 출처를 구분하는데 사용하고, Category는 로그의 성격을 나타내게 된다. 모듈화를 하는 경우 subsystem을 사용하여 어느 모듈에서 사용하는지 분리하고 category를 통해 이 로그가 network 성격을 가지고 있는지, ui에서 출력하는 로그인지 등을 분리할 수 있다.

Logger

이제 이 로거를 쉽게 사용할 수 있도록 클래스를 만들어보았다.

import Foundation
import OSLog

enum LogCategory: String {
case network
case ui
case database
case authentication
case none
}

final class Logger {
private static let subsystem = Bundle.main.bundleIdentifier ?? "your.app.bundleid"
static func osLog(for category: LogCategory) -> OSLog {
return OSLog(subsystem: subsystem, category: category.rawValue)
}
static func debug(_ message: String, category: LogCategory = .none) {
os_log("%{public}@", log: Logger.osLog(for: category), type: .debug, message)
}
static func info(_ message: String, category: LogCategory = .none) {
os_log("%{public}@", log: Logger.osLog(for: category), type: .info, message)
}
static func error(_ message: String, category: LogCategory = .none) {
os_log("%{public}@", log: Logger.osLog(for: category), type: .error, message)
}
func fault(_ message: String, category: LogCategory = .none) {
os_log("%{public}@", log: Logger.osLog(for: category), type: .fault, message)
}
}

Log의 카테고리로 어떤 종류의 로그인지 표시를 해준다. 그리고 각 함수의 이름으로 로깅 레벨을 만들어준다. 이유는 이전에 자바로 개발을 할 때 사용했던 로그를 참고했다. 정적함수로 만들어서 간단히 사용할 수 있게 만들어준다.

또 os_log의 첫 번째 인자의 public 대신 private을 사용하여 위에서 언급했던 로그의 마스킹 처리도 가능하다.

subsystem은 앱의 번들아이디를 넣어주면 된다.

Instruments

이제 이러한 로그를 쉽게 분석할 수도 있는데, Xcode 상단 메뉴의 Product → Profile을 선택하여 Instruments를 시작해준다.

그리고 다양한 템플릿 중 Logging을 선택한다.

좌측 상단에 Record 버튼을 누르면 앱이 실행되고 타임라인이 지나간다.

컬럼쪽을 보면 Subsystem, Category로 그룹화하여 확인할 수도 있다.

--

--

peppermint100
PEPPERMINT100

기억하기 위해 또는 잊어버리기 위해 작성하는 블로그입니다.