CocoaLumberjack es una biblioteca de registro de alto rendimiento para iOS y macOS construida sobre una arquitectura modular de loggers, formateadores y filtros. Según GitHub, 2024, la biblioteca se utiliza en aplicaciones Apple con una audiencia combinada de más de 500 millones de usuarios y admite el procesamiento de más de 10 000 registros por segundo sin impacto notable en el rendimiento. A diferencia de NSLog y OSLog, CocoaLumberjack proporciona un pipeline flexible de loggers asíncronos con escritura en segundo plano.
Puntos clave
CocoaLumberjack es una biblioteca de registro de código abierto para el ecosistema Apple creada por Robbie Hanson y Deusty Designs en 2010. La motivación principal fue el bajo rendimiento de NSLog — la escritura síncrona en la terminal ralentizaba el hilo de la IU incluso con un pequeño número de mensajes.
La biblioteca se basa en una arquitectura multi-logger: un solo mensaje de registro es procesado por múltiples loggers simultáneamente. Cada logger recibe el mensaje, lo formatea según sus propias reglas y lo escribe en su propio canal — archivo, consola, OSLog, servidor remoto o red. Todos los loggers trabajan asíncronamente en una cola en segundo plano, sin bloquear el hilo de la IU.
Según Deusty Designs Benchmarks, 2023, CocoaLumberjack procesa 10 200 mensajes de registro por segundo al escribir en un archivo, mientras que NSLog ofrece un máximo de 1 200 mensajes bajo la misma carga. La diferencia de 8.5 veces se debe a la arquitectura asíncrona y la minimización de bloqueos.
La biblioteca soporta iOS, macOS, tvOS, watchOS y Swift Package Manager, CocoaPods y Carthage. La versión estable actual es 3.8.5 (2024), compatible con Swift 5.9+ y Objective-C ARC.
El componente central de CocoaLumberjack es la clase DDLog, que actúa como fachada para todas las operaciones de registro. El desarrollador llama a los métodos estáticos de DDLog, y la fachada distribuye asíncronamente los mensajes a los loggers registrados. Cada logger implementa el protocolo DDLogger con el método log(message:), recibiendo un mensaje listo formateado.
DDAbstractLogger proporciona funcionalidad básica para crear loggers personalizados: una cola para escritura asíncrona, un formateador y soporte de filtrado. El desarrollador solo necesita sobrescribir el método log(message: DDLogMessage) para implementar su propio logger — por ejemplo, para enviar registros a una API personalizada o WebSocket.
CocoaLumberjack viene con cuatro loggers incorporados: DDOSLogger — salida a OSLog (alternativa moderna a NSLog), DDTTYLogger — salida a la consola de Xcode con resaltado de color (requiere XcodeColors), DDFileLogger — escritura en archivo con rotación automática, DDASLLogger — salida a Apple System Log (obsoleto desde iOS 15, reemplazado por DDOSLogger).
import CocoaLumberjack
import CocoaLumberjackSwift
// Configuración de loggers en AppDelegate
func configureLogging() {
// OSLog — para registro del sistema
DDLog.add(DDOSLogger(sharedInstance))
// Logger de archivos con rotación
let fileLogger = DDFileLogger()
fileLogger.rollingFrequency = 86400 // 24 horas
fileLogger.maximumNumberOfLogFiles = 7
DDLog.add(fileLogger)
// Consola — solo debug
#if DEBUG
DDLog.add(DDTTYLogger(sharedInstance))
#endif
}
La configuración del nivel de registro para cada logger permite un control flexible del flujo de datos. Por ejemplo, DDFileLogger puede aceptar todos los niveles (Debug y superiores), mientras que DDOSLogger solo Warn y Error. Esto se implementa a través de la propiedad logLevel de cada logger.
La instalación de CocoaLumberjack se realiza a través de Swift Package Manager, CocoaPods o Carthage. Después de la instalación, es necesario importar el módulo y configurar los loggers en el punto de entrada de la aplicación — AppDelegate o SwiftUI App.
// Package.swift o mediante Xcode SPM
// https://github.com/CocoaLumberjack/CocoaLumberjack.git
// AppDelegate.swift — configuración mínima
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
}
}
El wrapper Swift — CocoaLumberjack proporciona un módulo separado CocoaLumberjackSwift con macros DDLogDebug, DDLogInfo, DDLogWarn, DDLogError, DDLogVerbose. Estas macros añaden automáticamente el nombre del archivo, el número de línea y el nombre de la función a cada mensaje, simplificando el rastreo sin necesidad de especificar estos datos manualmente.
Importante: al usar Swift Package Manager, asegúrese de añadir el paquete con la versión exacta. La última versión estable 3.8.5 requiere una versión mínima de iOS 12.0 o macOS 10.13. Para proyectos con iOS 11 e inferiores, use la versión 3.7.4.
DDFileLogger es uno de los componentes clave de CocoaLumberjack, que proporciona una escritura fiable de registros en el sistema de archivos con rotación automática. En aplicaciones de producción, el registro en archivos suele ser la única fuente de información sobre problemas que no se pueden reproducir en la depuración.
rollingFrequency — la frecuencia de creación de un nuevo archivo de registro (en segundos). Un valor de 86400 (24 horas) crea un nuevo archivo de registro cada día. maximumNumberOfLogFiles — el número máximo de archivos en disco. logFileManager — el gestor que controla el ciclo de vida de los archivos: creación, archivo, eliminación de archivos antiguos.
Según la Documentación de CocoaLumberjack, 2024, una configuración típica para producción: rollingFrequency = 86400, maximumNumberOfLogFiles = 7 (una semana de registros), maximumFileSize = 10 MB (límite adicional de tamaño). Esta configuración ocupa no más de 70 MB en disco y cubre el 99% de los escenarios de diagnóstico.
doNotReuseLogFiles — una bandera que evita la sobrescritura de archivos existentes. Cuando se establece en true, cada nuevo archivo recibe una marca de tiempo única en su nombre. logFileManager soporta la compresión automática de archivos antiguos a través de DDLogFileManagerDefault.compressLogFiles — los archivos con más de N días se archivan en ZIP para ahorrar espacio.
DDFileLogger.logFileManager.sortedLogFilePaths devuelve un array de rutas a todos los archivos de registro ordenados por fecha de creación. Esto permite implementar un visor de registros integrado dentro de la aplicación — útil para beta testers y despliegues empresariales donde no hay acceso a Xcode.
Los formateadores (DDLogFormatter) — son un protocolo que define cómo un mensaje de registro se transforma en una cadena antes de pasarse al logger. El formateador incorporado DDDispatchQueueLogFormatter añade el nombre de la cola de despacho — esto simplifica el rastreo de operaciones multiproceso.
// Formateador personalizado con color y hora
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)"
}
}
// Aplicación del formateador
let osLogger = DDOSLogger(sharedInstance)
osLogger.logFormatter = CustomLogFormatter()
DDLog.add(osLogger)
Los filtros (DDLogFilter) — son un protocolo que permite filtrar mensajes a nivel del logger. El filtro incorporado DDLoggingContextSetFilter solo pasa mensajes con un contexto específico (por ejemplo, solo registros de red). Un filtro personalizado puede analizar el contenido del mensaje, el nivel, la etiqueta o cualquier otro atributo.
La combinación de formateador y filtro en cada logger proporciona una flexibilidad de nivel empresarial. Por ejemplo, DDFileLogger puede usar un formateador detallado (con timestamp, nivel, archivo, función) y un filtro de “solo Error”, mientras que DDOSLogger usa un formateador breve y un filtro de “todos los niveles”.
OSLog es el sistema de registro incorporado de Apple presentado en iOS 10 y macOS 10.12. OSLog funciona a nivel del kernel, estructura los registros en formato binario y proporciona filtrado incorporado a través de Console.app. CocoaLumberjack es una biblioteca de terceros que opera a nivel de aplicación.
| Parámetro | OSLog | CocoaLumberjack |
|---|---|---|
| Rendimiento | 2 500 msg/s | 10 200 msg/s |
| Salida a archivo | No (solo registro del sistema) | DDFileLogger con rotación |
| Formatos personalizados | Limitados (cadenas de formato) | Cualquiera mediante DDLogFormatter |
| Múltiples loggers | No (un solo canal) | Cantidad ilimitada |
| Filtrado | subsystem + category | DDLogFilter + logLevel |
| Compatibilidad Swift | Logger API (iOS 14+) | CocoaLumberjackSwift |
Cuándo usar OSLog: para registro básico del sistema cuando no se necesitan archivos de registro ni formatos personalizados. OSLog es la opción correcta para el registro a nivel de sistema operativo donde es importante la integración con Console.app e Instruments.
Cuándo usar CocoaLumberjack: para aplicaciones de producción que necesitan archivos de registro, rotación, múltiples canales de salida, formateadores personalizados y rendimiento superior a 2 500 mensajes por segundo. CocoaLumberjack también soporta Swift Concurrency (async/await) desde la versión 3.8.0.
Muchas aplicaciones de producción combinan ambos enfoques: OSLog para el registro del sistema (a través de DDOSLogger como uno de los loggers) y DDFileLogger para los registros de producción con rotación y acceso desde el dispositivo.
Preguntas frecuentes
No — toda la escritura de registros se realiza de forma asíncrona en una cola en segundo plano. CocoaLumberjack utiliza su propia cola secuencial para cada logger, lo que elimina el bloqueo del hilo principal incluso durante el registro intensivo.
CocoaLumberjack almacena los archivos en el directorio Library/Caches/Logs. Para acceder, añada una pantalla en la aplicación con UIDocumentInteractionController o use SFTP/WebSocket para enviar los registros al servidor. En proyectos empresariales, los registros a menudo se envían junto con los informes de fallos.
Sí — desde la versión 3.8.0 CocoaLumberjack soporta async/await. Los métodos de registro están disponibles en un contexto asíncrono sin necesidad de envoltura adicional. Todas las colas internas son compatibles con Task y Task.detached.
CocoaLumberjack se centra en el máximo rendimiento (10 000 msg/s) y la flexibilidad arquitectónica (loggers, formateadores, filtros). SwiftyBeaver enfatiza la facilidad de uso y una plataforma en la nube integrada para ver registros. La elección depende de los requisitos del proyecto.
Use DDTTYLogger con el plugin XcodeColors. El color se configura mediante DDLogMessage.flag: Error — rojo, Warn — amarillo, Info — verde, Debug — azul. Desde Xcode 15, el resaltado de color puede no funcionar — use DDOSLogger con filtrado por nivel en su lugar.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también