Joven hacker sonriendo

Hackeamos su software

cero falsos positivos

Inteligencia experta + automatización eficaz

Registrar Eventos en Bitácoras

Nuestros ethical hackers explican que son las bitácoras, porque es importante utilizarlas y cual es la manera adecuada de generar dichos informes en una aplicación Java con el fin de conocer los acontecimientos relevantes que han afectado la ejecución del programa.

Necesidad

Registrar eventos en las bitácoras de una aplicación Java.

Contexto

A continuación se describen las circunstancias bajo las cuales la siguiente solución tiene sentido:

  1. Se dispone de una aplicación Java conforme con la especificación del lenguaje 1.4.2 o superior.

  2. Se desea minimizar el número de dependencias externas de la aplicación (uso de frameworks de logging).

Solución

Una bitácora o log es una grabación secuencial en un archivo o en una base de datos de todos los acontecimientos (eventos o acciones) que afectan a un proceso particular (aplicación, actividad de una red informática, etc.). De esta forma constituye una evidencia del comportamiento del sistema.[1]

Generalmente los acontecimientos vienen anotados con el momento exacto o data (fecha, hora, minuto, segundo) en el que ocurrió, lo que permite analizar paso a paso la actividad. Además, una o más categorizaciones del acontecimiento registrado. Es frecuente usar categorías distintas para distinguir la importancia del acontecimiento estableciendo distintos niveles de registro los cuales suelen ser: depuración, información, advertencia y error.

El uso de bitácoras puede servir para:

  • Análisis forense.

  • Detección de intrusos.

  • Depuración de errores.

  • Motorización.

  • Cumplir con las leyes establecidas.

  • Auditoría.

Por otro lado, los logs pueden contener información confidencial que no debe ser revelada por privacidad e incluso seguridad del sistema. En estos casos es necesaria proteger la confidencialidad de la información haciendo uso de métodos de cifrado y demás.

Cada evento que desea grabarse en la bitácora tiene un nivel. Este nivel indica la prioridad o urgencia de dicho evento. Los niveles en orden descendente de urgencia son:

  • SEVERE.

  • WARNING.

  • INFO.

  • CONFIG.

  • FINE.

  • FINER.

  • FINEST.

Adicionalmente, existen niveles con significado solo en tiempo de configuración o despliegue, y que permiten deshabilitar por completo el registro de evento o por el contrario, habilitar el registro de eventos de todos los niveles.

  1. El API estándar de bitácoras de Java, se forma principalmente por el concepto de logger. Dicho concepto corresponde a un nombre de estructura jerárquica similar a la de los paquetes y clases, además representa una configuración particular para grabar eventos. Así, una clase, paquete o aplicación particular puede tener un logger particular cuya configuración puede ser cambiada en tiempo de despliegue.

  2. En el código fuente, el objeto logger correspondiente, es obtenido mediante

    logger.java
    1
    private static Logger logger = Logger.getLogger("com.FLUIDsignal.FLUIDmeters");
    
  3. Para grabar eventos asociados al logger existen dos opciones. La primera, mas corta, involucra el nivel del evento en el nombre de la función.

    1
    2
    3
    4
    5
    6
    7
    logger.severe("evento");
    logger.warning("evento");
    logger.info("evento");
    logger.config("evento");
    logger.fine("evento");
    logger.finer("evento");
    logger.finest("evento");
    
  4. El segundo involucra el nivel como un parámetro adicional.

    1
    2
    3
    4
    5
    6
    7
    logger.log(Level.SEVERE, "evento");
    logger.log(Level.WARNING, "evento");
    logger.log(Level.INFO, "evento");
    logger.log(Level.CONFIG, "evento");
    logger.log(Level.FINE, "evento");
    logger.log(Level.FINER, "evento");
    logger.log(Level.FINEST, "evento");
    
  5. Se recomienda el uso de la primera opción por su mantenibilidad y legibilidad.

  6. Adicionalmente, para cualquiera de las dos alternativas, existen versiones de las funciones que reciben como parámetro las excepciones generadas en una clausula try-catch.

    1
    2
    logger.warning("evento", e);
    logger.log(Level.WARNING, "evento", e);
    
  7. A continuación se presenta un ejemplo del uso completo del API de bitácoras en cuestión.

    ejemplo.java
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    import java.util.logging.Logger;
    import java.util.logging.Level;
    
    public class Main
    {
      private final static Logger logger = Logger.getLogger(Main.class.getName());
      public static void main(String argv[])
      {
        logger.setLevel(Level.WARNING);
        logger.warning("Comenzando el main");
        try
        {
          System.out.println("Hola");
          int i = 0/0;
        }
        catch (Exception e)
        {
          logger.severe("Problemas dentro del main");
        }
        logger.info("No se mostrará por no tener nivel
          WARNING o superior: Finalizando el main");
      }
    }
    
  8. Se observa la salida.

    salida.shell
    1
    2
    3
    4
    5
    6
    java com.FLUIDsignal.Main
    Nov 21, 2011 9:09:50 AM com.FLUIDsignal.Main main
    WARNING:: Comenzando el main
    Hola
    Nov 21, 2011 9:09:50 AM com.FLUIDsignal.Main main
    SEVERE: Problemas dentro del main
    
  9. Hay que notar que sólo los mensajes con nivel de depuración de INFO o superiores, como es el caso de SEVERE, fueron mostrados.

  10. La configuración de los loggers se define primero por los valores por defecto que se encuentran en lib/logging.properties en el directorio del JRE.

  11. Adicionalmente puede definir loggers particulares mediante la invocación de la máquina virtual con los siguientes parámetros

    logparticular.shell
    1
    java -Djava.util.logging.config.file=mylogging.properties <class>
    

Para ambientes de producción se recomienda utilizar niveles que contengan solo el nivel de detalle necesario y que no incluyan eventos de depuración. Esta recomendación ayudará a mantener el rendimiento de la aplicación y el tamaño de las bitácoras en valores apropiados.

Descargas

Puedes descargar el código fuente pulsando en el siguiente enlace:

Main.java Clase Main.




Haz un comentario

Estado de los servicios - Términos de Uso