OGLogger es una “librería” que desarrollé para simplificar la tarea de loggin y debug de errores en los proyectos en los que trabajo.

Inicialmente hacia uso y abuso de NSLog ( como creo que hicimos la mayoría de los que iniciamos en Objective-c )
Con el tiempo empecé a necesitar un logger más complejo, luego de buscar soluciones ya implementadas y de no encontrar ninguna con los features que estaba buscando, me decidí a desarrollar mi propio método para realizar el log de la aplicación.

Qué me interesa que tenga una Librería de loggin?

  • Diferentes niveles de log (Debug, info, warning, error, entre otros)
  • Configuración independiente para los diferentes módulos que pueda tener una aplicación.
  • Diferentes puntos de salida para la información que se loguea ( Consola, archivo de texto, webservice, etc.)
  • Facilidad para incluir en los proyectos que estoy desarrollando.
  • Poder cambiar la forma en que se comporta el logger cambiando la menor cantidad de código posible.
  • Facilidad para extender.

Tomando como inspiración LOG4J comencé a desarrollar “OGLogger”

OGLogger posee cuatro componentes fundamentales:

OGLogger
Es la clase que controla la lógica de loggin, decide que salidas debe generar y envía la información de log al OGLoggerOutput.

OGLoggerOutput
Esta clase es la encargada de generar la salida del log de la aplicación. Actualmente existen dos sub-clases:

- OGLoggerOutputConsole: loggea la información en la consola.

- OGLoggerOutputFile: logea la información en un archivo (esta funcionalidad aun no se enuentra implementada)

OGLoggerManager
Esta clase es un singleton, posee diferentes métodos (de instancia y de clase) para la creación y configuración de instancias de clase OGLogger

OGLoggerConfig.plist
Este archivo de configuración consiste en un Array de módulos de configuración. Para cada uno de estos módulos se indica cuál será la clase Logger a usar así como  también la clase a través de la que se generará la salida de la información.

 

Ejemplo de configuración:

Acá vemos definidos dos módulos, Logged y LoggedInherited.
El primero posee como clase base de loggin la clase OGLogger y como salida de la información la clase OGLoggerOutputConsole, la cual escribe en consola.
El segundo posee como clase base de loggin la clase OGLogger y como salida de la información la clase OGLoggerOutputFile, la cual escribe en un archivo en disco (Esta clase no se encuentra implementada).

  1. <plist version="1.0">
  2. <dict>
  3.         <key>Logged</key>
  4.         <dict>
  5.                 <key>OGLoggerClass</key>
  6.                 <string>OGLogger</string>
  7.                 <key>OGLoggerOutputClass</key>
  8.                 <string>OGLoggerOutputConsole</string>
  9.         </dict>
  10.         <key>LoggedInherited</key>
  11.         <dict>
  12.                 <key>OGLoggerClass</key>
  13.                 <string>OGLogger</string>
  14.                 <key>OGLoggerOutputClass</key>
  15.                 <string>OGLoggerOutputFile</string>
  16.         </dict>
  17. </dict>
  18. </plist>

Ejemplos de uso:

A continuación transcribo el fragmento de código de tres métodos posibles para incluir OGLogger dentro del proyecto en desarrollo

1) Propiedad OGLogger:
Definiendo una propiedad de tipo OGLogger dentro de la clase deseada, a través de la cual podremos acceder a los métodos de log deseados.

  1. //Header definition
  2.  
  3. #import
  4. #import "OGLogger.h"
  5.  
  6. @interface Logged : NSObject {
  7.  
  8. }
  9. @property(readonly)OGLogger * logger;
  10.  
  11. -(void)methodOne;
  12. -(void)methodTwo;
  13. @end
  14.  
  15. //Body Definition
  16. #import "Logged.h"
  17. #import "OGLogger.h"
  18. #import "OGLoggerManager.h"
  19.  
  20. @implementation Logged
  21.  
  22. -(OGLogger *)logger{
  23.     //NSLog(@"Class Name: %@",NSStringFromClass ([self class]));
  24.     //return [OGLoggerManager loggerForClassName:NSStringFromClass ([self class])];//Podríamos obtener el nombre de la clase en forma dinámica para utilizar la configuración correspondiente
  25.     return [OGLoggerManager loggerForClassName:@"Logged"]; //Cargamos la configuracion del modulo Logged
  26. }
  27.  
  28. -(void)methodOne{
  29.     [self.logger  error:@"Logged Method One"];
  30. }
  31. -(void)methodTwo{
  32.     [self.logger  error:@"Logged Method Two"];
  33. }
  34.  
  35. @end

2) Herencia:
Todas las clases que hereden de OGLoggedObject tendran acceso a la propiedad heredada “self.logger”

  1. //Header definition
  2. #import
  3. #import "OGLoggedObject.h"
  4.  
  5. @interface LoggedInherited : OGLoggedObject {
  6.  
  7. }
  8. -(void)methodOne;
  9. -(void)methodTwo;
  10. @end
  11.  
  12. //methodOne body implementation
  13.  
  14. -(void)methodOne{
  15.     [self.logger error:@"LoggedInherited Method One"];
  16. }

3) Addition:
Inyectando la lógica de loggin a través de un addition en la clase deseada

  1. //Header for addition
  2. #import
  3. #import "OGLogger.h"
  4. #import "LoggedWithAddition.h"
  5.  
  6. @interface LoggedWithAddition (OGLoggerAddition)
  7.  
  8. -(OGLogger *) logger;
  9.  
  10. @end
  11.  
  12. //Body for addition
  13. #import "LoggedWithAddition+OGLogger.h"
  14. #import "OGLoggerManager.h"
  15. #import "OGLogger.h"
  16.  
  17. @implementation LoggedWithAddition (OGLoggerAddition)
  18.  
  19. -(OGLogger *) logger{
  20.     return [OGLoggerManager console];//Utilizamos el loggin en consola
  21. }
  22.  
  23. @end
  24.  
  25. //Body of the logged class
  26. #import "LoggedWithAddition+OGLogger.h"
  27.  
  28. -(void)methodOne{
  29.     [self.logger error:@"LoggedWithAddition Method One"];
  30. }

 

 

Este es el link al repositorio principal de OGLogger , aquí podrán acceder al código fuente del proyecto y podrán ver ejemplos de su uso.

Cualquier sugerencia es bienvenida.

PD: No garantizo que el código no tenga algún que otro error ;)