CocoaLumberjack은 로거, 포맷터 및 필터의 모듈식 아키텍처를 기반으로 구축된 iOS 및 macOS용 고성능 로깅 라이브러리입니다. GitHub, 2024에 따르면, 이 라이브러리는 총 5억 명 이상의 사용자를 보유한 Apple 애플리케이션에서 사용되며 성능에 눈에 띄는 영향을 주지 않으면서 초당 10,000개 이상의 로그 처리를 지원합니다. NSLog 및 OSLog와 달리 CocoaLumberjack은 백그라운드 쓰기가 포함된 비동기 로거의 유연한 파이프라인을 제공합니다.
핵심 요점
CocoaLumberjack은 2010년 Robbie Hanson과 Deusty Designs가 만든 Apple 생태계를 위한 오픈 소스 로깅 라이브러리입니다. 주요 동기는 NSLog의 낮은 성능이었습니다 — 터미널에 대한 동기 쓰기는 적은 수의 메시지에서도 UI 스레드를 느리게 만들었습니다.
라이브러리는 멀티 로거 아키텍처를 기반으로 구축되었습니다: 단일 로그 메시지가 여러 로거에 의해 동시에 처리됩니다. 각 로거는 메시지를 수신하고 자체 규칙에 따라 형식을 지정한 다음 자체 채널(파일, 콘솔, OSLog, 원격 서버 또는 네트워크)에 씁니다. 모든 로거는 백그라운드 큐에서 비동기적으로 작동하여 UI 스레드를 차단하지 않습니다.
Deusty Designs Benchmarks, 2023에 따르면, CocoaLumberjack은 파일에 쓸 때 초당 10,200개의 로그 메시지를 처리하는 반면, NSLog는 동일한 부하에서 최대 1,200개의 메시지만 제공합니다. 8.5배의 차이는 비동기 아키텍처와 최소한의 잠금 때문입니다.
라이브러리는 iOS, macOS, tvOS, watchOS 및 Swift Package Manager, CocoaPods 및 Carthage를 지원합니다. 현재 안정 버전은 Swift 5.9+ 및 Objective-C ARC와 호환되는 3.8.5(2024)입니다.
CocoaLumberjack의 중앙 구성 요소는 모든 로깅 작업의 퍼사드 역할을 하는 DDLog 클래스입니다. 개발자가 DDLog 정적 메서드를 호출하면 퍼사드가 등록된 로거에 비동기적으로 메시지를 배포합니다. 각 로거는 log(message:) 메서드로 DDLogger 프로토콜을 구현하여 형식이 지정된 준비된 메시지를 수신합니다.
DDAbstractLogger는 사용자 정의 로거 생성을 위한 기본 기능을 제공합니다: 비동기 쓰기를 위한 큐, 포맷터 및 필터링 지원. 개발자는 자체 로거를 구현하기 위해 log(message: DDLogMessage) 메서드만 재정의하면 됩니다 — 예를 들어 사용자 정의 API 또는 WebSocket으로 로그를 보내는 경우입니다.
CocoaLumberjack에는 4개의 내장 로거가 함께 제공됩니다: DDOSLogger — OSLog로 출력(NSLog의 현대적 대안), DDTTYLogger — 색상 강조와 함께 Xcode 콘솔로 출력(XcodeColors 필요), DDFileLogger — 자동 순환으로 파일 쓰기, DDASLLogger — Apple System Log로 출력(iOS 15부터 더 이상 사용되지 않음, DDOSLogger로 대체됨).
import CocoaLumberjack
import CocoaLumberjackSwift
// AppDelegate에서 로거 설정
func configureLogging() {
// OSLog — 시스템 로깅용
DDLog.add(DDOSLogger(sharedInstance))
// 순환 기능이 있는 파일 로거
let fileLogger = DDFileLogger()
fileLogger.rollingFrequency = 86400 // 24시간
fileLogger.maximumNumberOfLogFiles = 7
DDLog.add(fileLogger)
// 콘솔 — 디버그 전용
#if DEBUG
DDLog.add(DDTTYLogger(sharedInstance))
#endif
}
각 로거에 대한 로그 수준 구성은 데이터 흐름을 유연하게 제어할 수 있습니다. 예를 들어 DDFileLogger는 모든 수준(Debug 이상)을 허용할 수 있고 DDOSLogger는 Warn 및 Error만 허용합니다. 이는 각 로거의 logLevel 속성을 통해 구현됩니다.
CocoaLumberjack의 설치는 Swift Package Manager, CocoaPods 또는 Carthage를 통해 수행됩니다. 설치 후 모듈을 가져오고 애플리케이션 진입점(AppDelegate 또는 SwiftUI App)에서 로거를 구성해야 합니다.
// Package.swift 또는 Xcode SPM을 통해
// https://github.com/CocoaLumberjack/CocoaLumberjack.git
// AppDelegate.swift — 최소 구성
import UIKit
import CocoaLumberjack
@main
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(
application: UIApplication,
didFinishLaunchingWithOptions options: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
DDLog.add(DDOSLogger(sharedInstance))
DDLogInfo("Logging configured successfully")
return true
}
}
Swift 래퍼 — CocoaLumberjack은 DDLogDebug, DDLogInfo, DDLogWarn, DDLogError, DDLogVerbose 매크로가 포함된 별도의 CocoaLumberjackSwift 모듈을 제공합니다. 이 매크로는 각 메시지에 파일 이름, 줄 번호 및 함수 이름을 자동으로 추가하여 데이터를 수동으로 지정하지 않고도 추적을 단순화합니다.
중요: Swift Package Manager를 사용할 때는 정확한 버전으로 패키지를 추가해야 합니다. 최신 안정 버전 3.8.5에는 최소 iOS 12.0 또는 macOS 10.13이 필요합니다. iOS 11 이하 프로젝트의 경우 버전 3.7.4를 사용하십시오.
DDFileLogger는 CocoaLumberjack의 주요 구성 요소 중 하나로, 자동 순환과 함께 파일 시스템에 안정적인 로그 쓰기를 제공합니다. 프로덕션 애플리케이션에서 파일 로깅은 디버깅에서 재현할 수 없는 문제에 대한 유일한 정보 소스인 경우가 많습니다.
rollingFrequency — 새 로그 파일 생성 빈도(초). 값 86400(24시간)은 매일 새 로그 파일을 만듭니다. maximumNumberOfLogFiles — 디스크의 최대 파일 수. logFileManager — 파일 수명 주기를 관리하는 관리자: 생성, 보관, 오래된 파일 삭제.
CocoaLumberjack Documentation, 2024에 따르면 일반적인 프로덕션 구성은 다음과 같습니다: rollingFrequency = 86400, maximumNumberOfLogFiles = 7(일주일 분량의 로그), maximumFileSize = 10 MB(추가 크기 제한). 이 구성은 디스크에서 70 MB를 넘지 않으며 진단 시나리오의 99%를覆盖합니다.
doNotReuseLogFiles — 기존 파일 덮어쓰기를 방지하는 플래그입니다. true로 설정하면 각 새 파일은 이름에 고유한 타임스탬프를 받습니다. logFileManager는 DDLogFileManagerDefault.compressLogFiles를 통해 오래된 파일의 자동 압축을 지원합니다 — N일보다 오래된 파일은 공간을 절약하기 위해 ZIP으로 보관됩니다.
DDFileLogger.logFileManager.sortedLogFilePaths는 생성 날짜별로 정렬된 모든 로그 파일의 경로 배열을 반환합니다. 이를 통해 앱 내에 내장 로그 뷰어를 구현할 수 있습니다 — Xcode에 액세스할 수 없는 베타 테스터 및 엔터프라이즈 배포에 유용합니다.
포맷터(DDLogFormatter) — 로거에 전달되기 전에 로그 메시지를 문자열로 변환하는 방법을 정의하는 프로토콜입니다. 내장 포맷터 DDDispatchQueueLogFormatter는 디스패치 큐 이름을 추가합니다 — 이는 멀티스레드 작업 추적을 단순화합니다.
// 색상 및 시간이 있는 사용자 정의 포맷터
class CustomLogFormatter: NSObject, DDLogFormatter {
private let dateFormatter: DateFormatter = {
let fmt = DateFormatter()
fmt.dateFormat = "yyyy-MM-dd HH:mm:ss.SSS"
return fmt
}()
func format(message logMessage: DDLogMessage) -> String? {
let timestamp = dateFormatter.string(
from: logMessage.timestamp)
let level = logMessage.level.name
let file = (logMessage.file as NSString).lastPathComponent
let line = logMessage.line
return "[\(timestamp)] [\(level)] [\(file):\(line)] \(logMessage.message)"
}
}
// 포맷터 적용
let osLogger = DDOSLogger(sharedInstance)
osLogger.logFormatter = CustomLogFormatter()
DDLog.add(osLogger)
필터(DDLogFilter) — 로거 수준에서 메시지를 필터링할 수 있는 프로토콜입니다. 내장 필터 DDLoggingContextSetFilter는 특정 컨텍스트(예: 네트워크 로그만)가 있는 메시지만 전달합니다. 사용자 정의 필터는 메시지 내용, 수준, 태그 또는 기타 속성을 분석할 수 있습니다.
각 로거의 포맷터와 필터 조합은 엔터프라이즈 수준의 유연성을 제공합니다. 예를 들어 DDFileLogger는 상세한 포맷터(타임스탬프, 수준, 파일, 함수 포함)와 “Error만” 필터를 사용할 수 있고 DDOSLogger는 간단한 포맷터와 “모든 수준” 필터를 사용할 수 있습니다.
OSLog는 iOS 10 및 macOS 10.12에 도입된 Apple의 내장 로깅 시스템입니다. OSLog는 커널 수준에서 작동하고 로그를 바이너리 형식으로 구조화하며 Console.app을 통해 내장 필터링을 제공합니다. CocoaLumberjack은 애플리케이션 수준에서 작동하는 타사 라이브러리입니다.
| 매개변수 | OSLog | CocoaLumberjack |
|---|---|---|
| 성능 | 2,500 msg/s | 10,200 msg/s |
| 파일 출력 | 없음(시스템 로그만) | 순환 기능이 있는 DDFileLogger |
| 사용자 정의 형식 | 제한적(형식 문자열) | DDLogFormatter를 통해任意 |
| 다중 로거 | 없음(단일 채널) | 무제한 |
| 필터링 | subsystem + category | DDLogFilter + logLevel |
| Swift 호환성 | Logger API(iOS 14+) | CocoaLumberjackSwift |
OSLog를 사용해야 하는 경우: 파일 로그와 사용자 정의 형식이 필요하지 않은 기본 시스템 로깅용. OSLog는 Console.app 및 Instruments와의 통합이 중요한 OS 수준 로깅에 적합한 선택입니다.
CocoaLumberjack을 사용해야 하는 경우: 파일 로그, 순환, 여러 출력 채널, 사용자 정의 포맷터 및 초당 2,500개 이상의 메시지 성능이 필요한 프로덕션 애플리케이션용. CocoaLumberjack은 버전 3.8.0부터 Swift Concurrency(async/await)도 지원합니다.
많은 프로덕션 애플리케이션이 두 접근 방식을 결합합니다: 시스템 로깅용 OSLog(로거 중 하나로 DDOSLogger를 통해)와 순환 및 디바이스 액세스가 있는 프로덕션 로그용 DDFileLogger.
자주 묻는 질문
아니요 — 모든 로그 쓰기는 백그라운드 큐에서 비동기적으로 수행됩니다. CocoaLumberjack은 각 로거에 대해 자체 직렬 큐를 사용하므로 집중적인 로깅에서도 메인 스레드 차단이 발생하지 않습니다.
CocoaLumberjack은 Library/Caches/Logs 디렉토리에 파일을 저장합니다. 액세스하려면 UIDocumentInteractionController를 사용하여 앱에 화면을 추가하거나 SFTP/WebSocket을 사용하여 로그를 서버에 보냅니다. 엔터프라이즈 프로젝트에서는 로그가 크래시 리포트와 함께 전송되는 경우가 많습니다.
네 — 버전 3.8.0부터 CocoaLumberjack이 async/await를 지원합니다. 로그 메서드는 추가 래핑 없이 비동기 컨텍스트에서 사용할 수 있습니다. 모든 내부 큐는 Task 및 Task.detached와 호환됩니다.
CocoaLumberjack은 최대 성능(10,000 msg/s)과 아키텍처 유연성(로거, 포맷터, 필터)에 중점을 둡니다. SwiftyBeaver는 사용 편의성과 로그 보기를 위한 내장 클라우드 플랫폼을 강조합니다. 선택은 프로젝트 요구 사항에 따라 다릅니다.
XcodeColors 플러그인과 함께 DDTTYLogger를 사용하세요. 색상은 DDLogMessage.flag를 통해 구성됩니다: Error — 빨간색, Warn — 노란색, Info — 녹색, Debug — 파란색. Xcode 15부터 색상 강조가 작동하지 않을 수 있습니다 — 대신 수준 필터링과 함께 DDOSLogger를 사용하세요.
요약
턴키 방식의 모바일 애플리케이션을 개발해 드립니다
IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.