Introducción: ¿Por qué es necesario el logging en Swift?
El logging es una herramienta fundamental para el desarrollador que permite rastrear el estado de la aplicación, identificar errores y analizar el comportamiento del usuario. En el ecosistema Swift (iOS/macOS), un logging bien configurado puede ahorrar horas de depuración y ayudar a evitar problemas en las versiones de producción.
En este artículo, analizaremos las mejores prácticas de logging en Swift: desde las soluciones integradas de Apple hasta las bibliotecas de terceros más populares. Aprenderás cómo no sobrecargar la aplicación, cómo proteger datos sensibles y cómo hacer que los logs sean útiles para todo el equipo.
1. Herramientas integradas: OSLog y print
1.1 Por qué print() es malo
La forma más sencilla de hacer logging es el comando print(). Sin embargo, no se recomienda usarlo en la versión de producción:
- No tiene niveles de importancia (info, warning, error).
- No es posible filtrar logs en la consola de Xcode.
- El texto se muestra incluso en la compilación de lanzamiento (si no se elimina manualmente).
- No hay estructuración de datos.
1.2 OSLog — el estándar de Apple
A partir de iOS 10 y macOS 10.12, Apple recomienda usar os_log del framework os.log. Es un mecanismo integrado que funciona de forma rápida y segura.
import os.log
let logger = Logger(subsystem: "com.example.myapp", category: "network")
func fetchData() { logger.info("Inicio de la carga de datos") // ... código de carga logger.warning("El servidor respondió con retraso") // ... manejo de errores logger.error("No se pudo conectar al servidor: \\(error.localizedDescription)")}Ventajas de OSLog:
- Desactivación automática en compilaciones de lanzamiento (excepto errores).
- Soporte para categorías y subsistemas para filtrar.
- Integración con Console.app y Xcode.
- Seguridad: los datos privados se ocultan automáticamente (marcador
private).
2. SwiftLog — API universal
2.1 ¿Qué es SwiftLog?
SwiftLog es una biblioteca open-source de Apple que proporciona una interfaz unificada para el logging. No depende de la plataforma y permite conectar diferentes backends (OSLog, archivos, servidores).
2.2 Instalación y configuración
Añade SwiftLog a través de Swift Package Manager:
// Package.swiftdependencies: [ .package(url: "https://github.com/apple/swift-log.git", from: "1.5.0")]Ejemplo de uso:
import Logging
let logger = Logger(label: "com.example.app")
logger.info("Aplicación iniciada")logger.warning("Batería baja: \\(batteryLevel)%")logger.error("Error crítico: \\(error)")
// Configuración del nivel de loggingLoggingSystem.bootstrap { label in var handler = StreamLogHandler.standardOutput(label: label) handler.logLevel = .debug return handler}Características clave:
- Niveles: trace, debug, info, notice, warning, error, critical.
- Metadatos (cualquier campo adicional).
- Backend fácilmente reemplazable (por ejemplo, para enviar a Crashlytics).
- Costo cero cuando el nivel está desactivado (más rápido que
print).
3. Bibliotecas de terceros: CocoaLumberjack y Pulse
3.1 CocoaLumberjack — flexibilidad y potencia
Una de las bibliotecas más populares para Objective-C y Swift. Permite escribir logs en archivos, consola, servidor remoto e incluso en una base de datos.
import CocoaLumberjack
// ConfiguraciónDDLog.add(DDOSLogger.sharedInstance) // Consolalet fileLogger = DDFileLogger()fileLogger.rollingFrequency = 60 * 60 * 24 // 24 horasDDLog.add(fileLogger)
// UsoDDLogInfo("Usuario autenticado")DDLogWarn("Tiempo de espera de red agotado")DDLogError("