CocoaLumberjack — високоперформансна библиотека за логирање за iOS и macOS, изграђена на модуларној архитектури логера, форматера и филтера. Према подацима GitHub, 2024, библиотека се користи у Apple апликацијама са укупном публиком преко 500 милиона корисника и подржава обраду више од 10 000 логова у секунди без приметног утицаја на перформансе. За разлику од NSLog-а и OSLog-а, CocoaLumberjack пружа флексибилан pipeline од асинхроних логера са записом у позадини.
Главно
CocoaLumberjack — библиотека отвореног кода за логирање у Apple екосистему, коју су 2010. створили Роби Хансон (Robbie Hanson) и Деб Вермер (Deusty Designs). Главна мотивација за њено стварање биле су ниске перформансе NSLog-а — синхрони упис у терминал успоравао је UI-нит чак и при малом броју порука.
Библиотека је изграђена на архитектури multi-logger: једна лог-порука се обрађује истовремено од стране више логера. Сваки логер прима поруку, форматира је по сопственим правилима и уписује у свој канал — датотеку, конзолу, OSLog, удаљени сервер или мрежу. Сви логери раде асинхроно у позадинској реду, не блокирајући UI-нит.
Према подацима Deusty Designs Benchmarks, 2023, CocoaLumberjack обрађује 10 200 лог-порука у секунди при упису у датотеку, док NSLog испоручује максимално 1 200 порука при истом оптерећењу. Разлика од 8.5 пута последица је асинхроне архитектуре и минимизације блокирања.
Библиотека подржава iOS, macOS, tvOS, watchOS и Swift Package Manager, CocoaPods и Carthage. Тренутна стабилна верзија — 3.8.5 (2024), компатибилна са Swift 5.9+ и Objective-C ARC.
Централна компонента CocoaLumberjack-а — класа DDLog, која делује као фасада за све операције логирања. Програмер позива статичке методе DDLog-а, а фасада асинхроно распоређује поруке регистрованим логерима. Сваки логер имплементира протокол DDLogger са методом log(message:), примајући готову форматирану поруку.
DDAbstractLogger пружа основну функционалност за креирање прилагођених логера: ред за асинхрони упис, форматер и подршку за филтрирање. Програмеру је довољно да редефинише метод log(message: DDLogMessage) за имплементацију сопственог логера — на пример, за слање логова у сопствени API или WebSocket.
CocoaLumberjack се испоручује са четири уграђена логера: DDOSLogger — излаз у OSLog (савремена алтернатива NSLog-у), DDTTYLogger — излаз у Xcode конзолу са шареним истицањем (захтева XcodeColors), DDFileLogger — упис у датотеку са аутоматском ротацијом, DDASLLogger — излаз у Apple System Log (deprecated од 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)
// Конзола — само за debug
#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 омoт — CocoaLumberjack пружа посебан модул CocoaLumberjackSwift са макроима DDLogDebug, DDLogInfo, DDLogWarn, DDLogError, DDLogVerbose. Ови макрои аутоматски додају име датотеке, број реда и име функције у сваку поруку, што поједностављује праћење без ручног навођења ових података.
Важно: при коришћењу 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 свака нова датотека добија јединствени timestamp у имену. logFileManager подржава аутоматску компресију старих датотека преко DDLogFileManagerDefault.compressLogFiles — датотеке старије од N дана архивирају се у ZIP ради уштеде простора.
DDFileLogger.logFileManager.sortedLogFilePaths враћа низ путања до свих лог-датотека, сортираних по датуму креирања. То омогућава имплементацију уграђеног прегледача логова унутар апликације — корисно за бета тестере и enterprise имплементације где нема приступа 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 пропушта само поруке са одређеним контекстом (на пример, само мрежне логове). Прилагођени филтер може да анализира садржај поруке, ниво, tag или било које друге атрибуте.
Комбинација форматера и филтера на сваком логеру даје флексибилност на нивоу enterprise. На пример, DDFileLogger може да користи детаљан форматер (са timestamp-ом, нивоом, датотеком, функцијом) и филтер „само Error”, а DDOSLogger — кратак форматер и филтер „сви нивои”.
OSLog — уграђени систем логирања компаније Apple, представљен у iOS 10 и macOS 10.12. 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.
Када користити CocoaLumberjack: за производне апликације са потребом за логовима у датотекама, ротацијом, вишеструким каналима излаза, прилагођеним форматерима и перформансама изнад 2 500 порука у секунди. CocoaLumberjack такође подржава Swift Concurrency (async/await) од верзије 3.8.0.
Многе производне апликације комбинују оба приступа: OSLog за системско логирање (преко DDOSLogger-а као једног од логера) и DDFileLogger за производне логове са ротацијом и приступом са уређаја.
Често постављана питања
Не — цео упис логова се обавља асинхроно у позадинском реду. CocoaLumberjack користи сопствени секвенцијални ред за сваки логер, што искључује блокирање главне нити чак и при интензивном логирању.
CocoaLumberjack чува датотеке у директоријуму Library/Caches/Logs. За приступ додајте у апликацију екран са UIDocumentInteractionController или користите SFTP/WebSocket за слање логова на сервер. У enterprise пројектима логови се често шаљу заједно са crash извештајима.
Да — од верзије 3.8.0 CocoaLumberjack подржава async/await. Лог-методе су доступне у асинхроном контексту без додатног омота. Сви унутрашњи редови су компатибилни са Task и Task.detached.
CocoaLumberjack је усмерен на максималне перформансе (10 000 msg/s) и архитектонску флексибилност (логери, форматери, филтери). SwiftyBeaver ставља акценат на једноставност коришћења и уграђену облачну платформу за преглед логова. Избор зависи од захтева пројекта.
Користите DDTTYLogger са додатком XcodeColors. Боја се подешава преко DDLogMessage.flag: Error — црвена, Warn — жута, Info — зелена, Debug — плава. Од верзије Xcode 15 шарено истицање можда неће радити — уместо њега користите DDOSLogger са филтером по нивоу.
Резиме
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође