Students Save 30%! Learn & create with unlimited courses & creative assets Students Save 30%! Save Now
Advertisement
  1. Code
  2. iOS SDK
Code

CocoaLumberjack: Logging en Steroids

by
Difficulty:BeginnerLength:LongLanguages:

Spanish (Español) translation by CYC (you can also view the original English article)

El logging es uno de los instrumentos más útiles para inspeccionar, comprender y depurar aplicaciones iOS y OS X. Probablemente estés familiarizado con la función NSLog proporcionada por el framework Foundation, pero ¿alguna vez sentiste la necesidad de algo más poderoso? CocoaLumberjack es una biblioteca de código abierto creada y mantenida por Robbie Hanson. CocoaLumberjack lleva el registro a un nivel completamente nuevo, y en este tutorial te mostraré cómo configurar y usar CocoaLumberjack en una aplicación de iOS.


¿Logging? ¿Quién necesita logging?

El logging o registro de información de diagnóstico en una consola, archivo o servidor remoto se usa ampliamente en casi cualquier tipo de desarrollo de software. Es una de las formas más simples de depuración, que es probablemente la razón por la cual está tan extendida. Es la primera herramienta que uso cuando estoy depurando o tratando de entender una pieza lógica compleja, independientemente del idioma. Es fácil, rápido y viene con muy poca sobrecarga.

¿Por qué deberías usar CocoaLumberjack si todo lo que hace es enviar datos a la consola o a un archivo? Una razón es que CocoaLumberjack es (en su mayoría) más rápido que la función NSLog que nos proporciona el framework de Foundation. Gracias a varias macros convenientes proporcionadas por CocoaLumberjack, cambiar de NSLog a CocoaLumberjack es tan fácil como reemplazar tu NSLog con sentencias DDLog.

Otro beneficio de CocoaLumberjack es que se puede enviar una declaración de registro a varios registradores (consola, archivo, base de datos remota, etc.). Puedes configurar CocoaLumberjack de manera que se comporte de manera diferente según la configuración de compilación (Depuración, Liberación, etc.). Hay mucho más que CocoaLumberjack puede hacer por ti, así que déjame mostrarte cómo comenzar con esta biblioteca ingeniosa.


Paso 1: Configurando CocoaLumberjack

Crea un nuevo proyecto en Xcode seleccionando la plantilla de aplicación de vista única de la lista de plantillas disponibles (figura 1). Asigna el nombre de Logging a la aplicación, ingresa el identificador de la compañía, configura el iPhone para la familia del dispositivo y luego selecciona Usar conteo de referencia automático. El resto de las casillas de verificación se pueden dejar sin marcar para este proyecto (figura 2). Dile a Xcode dónde quieres guardar el proyecto y presiona el botón Crear.

CocoaLumberjack: Logging on Steroids: Choosing a Project Template - Figure 1
CocoaLumberjack: Logging on Steroids: Configuring the New Project - Figure 2

Agregar la biblioteca CocoaLumberjack a tu proyecto es tan fácil como descargar la última versión de GitHub, extraer el archivo y arrastrar la carpeta denominada Lumberjack a tu proyecto. Los archivos principales son DDLog.h/.mDDASLLogger.h/.mDDTTYLogger.h/.m, y DDFileLogger.h/.m. Los otros archivos en la carpeta son stubs para usos más avanzados de CocoaLumberjack, que no cubriré en este tutorial. Puedes ignorar o eliminar estos archivos.

Si tomas una cima dentro de DDLog.h y DDLog.m, puede sorprenderte la cantidad de líneas de código en estos archivos. Como dije, CocoaLumberjack tiene muchas características realmente útiles. CocoaLumberjack es más poderoso que NSLog porque aprovecha el multi-threading, Grand Central Dispatch y el poder del tiempo de ejecución de Objective-C.

También notarás que hay una sorprendente cantidad de macros definidas en DDLog.h. No usaremos la mayoría de estas macros. Las macros que utilizaremos en este tutorial son DDLogError, DDLogWarn, DDLogInfo y DDLogVerbose. Todos realizan la misma tarea, pero cada macro está asociada con un nivel de registro. Hablaré más sobre los niveles de registro en unos momentos.

Antes de comenzar a utilizar CocoaLumberjack, es una buena idea agregar una declaración de importación al archivo de encabezado precompilado del proyecto. Abre Logging-Prefix.pch y agrega una instrucción de importación para DDLog.h. Esto garantiza que las macros definidas en DDLog.h estén disponibles durante todo el proyecto.


Paso 2: Agregar un registrador

Configurar CocoaLumberjack es fácil. Primero tenemos que importar varias clases de la biblioteca CocoaLumberjack. En la parte superior de MTAppDelegate.m, agrega una instrucción de importación para DDASLLogger.h, DDTTYLogger.h y DDFileLogger.h (consulta a continuación). Las primeras dos clases se encargan de enviar mensajes de registro a la aplicación de la Consola (Console.app) y Xcode Console. La clase DDFileLogger se encarga de escribir mensajes de registro en un archivo en el disco.

En el método aplicación del delegado application:didFinishLaunchingWithOptions: agregamos dos registradores como se muestra a continuación. Tanto DDASLLogger como DDTTYLogger son singleton, como habrás notado. Con esta configuración, imitamos el comportamiento de la función NSLog, es decir, los mensajes de registro se envían a la aplicación de la Consola (Console.app) y a la consola de Xcode.

Esto es todo lo que tenemos que hacer para comenzar con CocoaLumberjack. Puedes probar esto agregando las siguientes instrucciones de registro al método viewDidLoad de la clase MTViewController. Compila y ejecuta el proyecto en el simulador de iOS para ver si todo funciona como se espera.

¿También te encontraste con un error de compilación? El error del compilador dice Uso del identificador no declarado 'ddLogLevel'. Parece que tenemos que declarar ddLogLevel antes de poder utilizar CocoaLumberjack. Esta es en realidad una característica de CocoaLumberjack. Al declarar y asignar dinámicamente un valor a ddLogLevel, podemos configurar CocoaLumberjack de tal manera que las instrucciones de registro se ejecuten en función de la configuración de compilación. Para entender lo que quiero decir, modifica el archivo de encabezado precompilado de nuestro proyecto (Logging-Prefix.pch) como se muestra a continuación.

Por defecto, CocoaLumberjack define cuatro niveles de registro, (1) error, (2) advertencia, (3) información y (4) registro detallado. La definición de niveles de registro es muy común en las bibliotecas de registro (por ejemplo, log4j y log4php). Al asignar un nivel de registro a una declaración de registro, se puede categorizar, lo cual es muy útil, como verás en un momento. En el archivo de encabezado precompilado, declaramos ddLogLevel y le asignamos un valor. El valor de ddLogLevel determina qué instrucciones de registro se ejecutan y cuáles se ignoran. En otras palabras, si la configuración de compilación es igual a Depuración (léase: si se define la macro de preprocesador DEBUG), entonces ddLogLevel es igual a LOG_LEVEL_VERBOSE, el nivel de registro más alto. Esto significa que se ejecutará cada sentencia de registro. Sin embargo, si la configuración de compilación no es igual a Debug o Depurar, solo se ejecutarán las sentencias de registro con un nivel de error de registro. Es importante saber que los niveles de registro están ordenados como se puede ver en DDLog.h donde están definidos.

¿Por qué es esto útil? Esto proporciona un mecanismo muy fácil para controlar lo que se registra en función de la configuración de compilación. Puedes probar esto cambiando el esquema activo actual en Xcode. Detén la aplicación y haz clic en el esquema activo denominado Logging a la derecha del botón de detención (figura 3). Selecciona Editar esquema... en el menú y haz clic en Ejecutar registro o Ejecutar Logging en la izquierda (figura 4). Debajo de la pestaña Información, ajusta la Configuración de compilación para liberar (figura 4). Con esta opción, selecciona la configuración de compilación que Xcode debe usar cuando la aplicación se ejecuta en el simulador de iOS.

CocoaLumberjack: Logging on Steroids: Selecting the Active Scheme in Xcode - Figure 3
CocoaLumberjack: Logging on Steroids: Editing the Active Scheme in Xcode - Figure 4

Si ahora compilas y ejecutas tu proyecto en el simulador de iOS, solo deberías ver las declaraciones de registro con un nivel de error de registro impreso en la consola de Xcode. Se ignoran todas las declaraciones de registro con un nivel de registro mayor que el error. Ten en cuenta que la macro del preprocesador DEBUG se llama CONFIGURATION_DEBUG en Xcode 3. Puedes leer más sobre esto en la wiki de CocoaLumberjack.


Paso 3: Enviar los registros a un archivo

Enviar los registros a un archivo es pan comido con CocoaLumberjack. No solo es fácil de configurar, CocoaLumberjack viene con una cantidad de opciones útiles, como limitar el tamaño del archivo de los archivos de registro y establecer una frecuencia de rotación. Incluso puedes decirle a CocoaLumberjack que elimine archivos de registro antiguos a medida que se crean nuevos archivos de registro. Déjame mostrarte cómo funciona esto.

Revisa la aplicación del método delegado de application:didFinishLaunchingWithOptions: y actualiza su implementación como se muestra a continuación. Después de inicializar una instancia de DDFileLogger, lo configuramos (1) ajustando el tamaño máximo de archivo de cada archivo de registro (en bytes), (2) configurando la frecuencia de rotación a 24 horas, y (3) estableciendo el número máximo de archivos de registro eso debería mantenerse a siete. No olvides agregar el registrador de archivos como lo hicimos anteriormente.

Antes de compilar y ejecutar el proyecto, abre el Finder y ve a la siguiente ubicación,~/Library/Application Support/iPhone Simulator//Applications//Library/Caches/. Como puedes ver, la ruta puede ser ligeramente diferente dependiendo de la versión del simulador de iOS que estés utilizando. Ejecuta la aplicación en el simulador de iOS e inspecciona los contenidos del directorio de Caches. Ahora deberías tener una carpeta llamada Logs que contenga un archivo de texto llamado log-XXXXXX.txt. Los últimos seis caracteres del nombre de archivo son exclusivos para evitar que se sobrescriban los archivos de registro. Es posible especificar la ubicación donde se almacenarán los archivos de registro. Ten en cuenta que el sistema operativo puede vaciar el directorio de Caches en cualquier momento. Si deseas almacenar los archivos de registro de tu aplicación en una ubicación más segura, te sugiero que los almacenes en el directorio Documentos de la aplicación.


Bonificación: Colores

A pesar de que los colores no parecen ser más que dulces ojos, cada desarrollador sabe cuán importantes son los colores cuando se trabaja en un editor de código. Con CocoaLumberjack, puedes agregar color a la consola de Xcode. Robbie Hanson, el creador de CocoaLumberjack, también contribuyó a un complemento de Xcode llamado Xcode Colors. CocoaLumberjack funciona muy bien con Xcode Colors. Descarga la última versión de Xcode Colors, extrae el archivo y coloca su contenido en la carpeta de plug-ins de Xcode (ubicada en ~/Library/Application Support/Developer/Shared/Xcode/Plug-ins/) y reinicia Xcode. Ten en cuenta que puede ser necesario crear manualmente la carpeta de complementos si no está presente.

Para habilitar los colores en la consola de Xcode, regresa al método application:didFinishLaunchingWithOptions: y dile a la instancia compartida de la clase TTYLogger que habilite los colores (mira a continuación). CocoaLumberjack usa colores predeterminados si no especificas un color para un nivel de registro específico. Anular la configuración de color predeterminada es fácil, como se muestra a continuación. Ejecuta la aplicación en el simulador de iOS e inspecciona la ventana de consola de Xcode para ver el resultado (figura 5).

CocoaLumberjack: Logging on Steroids: Adding Color to Xcode's Console - Figure 5

Ya mencioné que CocoaLumberjack define cuatro niveles de registro de forma predeterminada. Sin embargo, es posible definir niveles de registro personalizados. No discutiré los niveles de registro personalizados en este tutorial, pero si deseas obtener más información acerca de esta característica, te sugiero que leas el artículo sobre los niveles de registro personalizados en CocoaLumberjack's Wiki.

La combinación de colores con niveles de registro personalizados resulta en una herramienta muy poderosa para recopilar datos y depurar una aplicación. Recuerda que CocoaLumberjack tiene mucho más que ofrecer que lo que he demostrado en este breve tutorial. Con CocoaLumberjack, puedes crear registradores personalizados y formateadores personalizados. Los registradores personalizados son especialmente útiles si deseas registrar datos en una base de datos o enviar archivos de registro a un servidor remoto en intervalos de tiempo regulares. CocoaLumberjack realmente es una poderosa biblioteca que se ha convertido en una herramienta indispensable en mi caja de herramientas.


Conclusión

Registrar los datos de la aplicación y la información de diagnóstico en la consola o en un archivo puede ser muy útil para depurar problemas tanto durante el desarrollo como en la producción. Por lo tanto, es esencial contar con una solución de registro sólida. Junto con muchos otros desarrolladores, he creado soluciones de registro personalizadas para muchos proyectos, pero CocoaLumberjack es un reemplazo ideal y tiene mucho más que ofrecer.

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.