banner

Noticias

Jun 01, 2023

Guía de registro de Java: conceptos básicos

Arfan Sharif - 13 de febrero de 2023

El registro lo ayuda a comprender cómo funciona una aplicación o qué salió mal cuando algo falla. Esta información puede ser fundamental para fines de depuración y auditoría. Los registros mantienen un rastro de cada evento durante la ejecución de un programa, haciendo que esos registros estén disponibles para un análisis posterior.

Sin embargo, el registro efectivo no ocurre automáticamente. Los desarrolladores de aplicaciones deben asegurarse de que una aplicación registre sistemáticamente detalles importantes en un formato fácil de procesar.

El enfoque más rudimentario para el registro es el uso simple de declaraciones de impresión para mostrar los detalles de la aplicación deseada. Por supuesto, este no es un enfoque ideal por las siguientes razones:

Por todas estas razones, muchos lenguajes de programación, como Java, incluyen marcos y API de registro dedicados. En esta descripción general, la primera parte de la serie, presentaremos los conceptos básicos de registro para aplicaciones Java. Veremos las opciones de registro y luego consideraremos varios marcos de registro disponibles y sus configuraciones admitidas.

Explore la serie completa de guías de registro de Java:

Como todo lo demás en su arquitectura, Java adopta un enfoque extensible y personalizable para el registro. El marco java.util.logging es la opción predeterminada para todas las funciones relacionadas con el registro. Este marco proporciona todas las funciones básicas necesarias para el registro y permite que los marcos de terceros amplíen esas funciones.

Este marco de registro incluye tres módulos principales:

Otro concepto que vale la pena mencionar aquí es el Filtro. Los filtros permiten al desarrollador interceptar un LogRecord y decidir qué controlador debe usarse. Si bien son innecesarios para el registro básico, los filtros pueden ayudar a cumplir requisitos de registro complejos.

Para el marco de registro de Java, la ubicación de salida predeterminada es el directorio de inicio del usuario.

Si bien el marco de registro de Java proporciona todas las funciones básicas, los marcos de trabajo de terceros pueden hacer bastante al combinar registradores, controladores y formateadores. Log4j 2 y Logback son dos marcos de registro populares, cada uno con sus propias fortalezas.

Dado que hay múltiples marcos disponibles para Java y sus conjuntos de características siempre están evolucionando, los desarrolladores a menudo quieren probar algo diferente. Aquí es donde entran en juego los extractores de registro. Los abstractores permiten a los desarrolladores cambiar rápidamente entre marcos de registro mediante el uso de una especificación de función estándar. Simple Logging Facade para Java (SLF4J) es un extractor de registro popular que admite el marco predeterminado, Log4j 2 y Logback. Apache commons-logging es otro extractor de este tipo.

Sin embargo, es importante tener en cuenta que las versiones sin parches de Log4j 2 representan un riesgo de seguridad crítico (CVE-2021-44228). Aunque menos graves, también existen riesgos de seguridad considerables para Log4j 1.x (CVE-2021-4104) y Logback (CVE-2021-42550). Debido a que el uso de extractores aún depende de estos marcos subyacentes, es imperativo que estas bibliotecas vulnerables se actualicen y parcheen adecuadamente para un uso seguro.

El marco predeterminado utiliza un archivo de configuración para definir los detalles de los agregadores, registradores y diseños. De forma predeterminada, este archivo está presente en la carpeta lib del directorio de instalación de Java, pero es un archivo de configuración global.

Es una buena práctica definir un archivo de configuración específico de la aplicación. Puede hacerlo especificando el nombre del archivo de propiedades al iniciar la aplicación, como se muestra a continuación:

Un archivo de configuración simple se verá así:

Aquí, la configuración registrará los eventos de la aplicación en un archivo que creará en el directorio de inicio del usuario. El valor %h denota el directorio de inicio y %u denota un número único arbitrario que Java establecerá para distinguir entre archivos de registro.

Ahora, para crear un nuevo archivo de registro a partir de una nueva clase, puede usar el siguiente fragmento de código:

Cuándo y qué registrar depende completamente del desarrollador de la aplicación, y depende de la estrategia de registro adoptada por el equipo de la aplicación. Una vez que el desarrollador decide qué eventos registrar, el registro simplemente requiere una sola línea de código. Aquí hay un ejemplo:

Aquí, el fragmento usa el método logger.log para conservar un evento de registro. El método toma dos entradas: la configuración del nivel del registrador y el texto que se registrará.

Puede utilizar otros dos métodos para conservar los eventos de registro. El método logp registra el nombre de la clase y las funciones junto con el texto. El método logrb le permite especificar el paquete de recursos para la localización. Esto es importante para las aplicaciones multilingües. Ambos métodos se pueden utilizar en lugar del método de registro.

El marco de registro admite cinco tipos de controladores (y, por lo tanto, cinco tipos de destinos). Estos se pueden configurar fácilmente en el archivo de propiedades o en el código. Exploremos estos cinco controladores y veamos cómo se supone que deben usarse.

controlador de consola: Como sugiere el nombre, esto generará eventos de registro en la consola. No hay ningún mecanismo para persistir la salida aquí. Todas las entradas del registro se perderán una vez que finalice la consola. Puede especificar el controlador en el archivo de propiedades:

FileHandler: este controlador escribe registros en un archivo. Este controlador le permite rotar los archivos de registro cuando alcanzan un tamaño específico. El fragmento a continuación muestra cómo configurar este controlador, junto con sus parámetros específicos en el archivo de propiedades:

El parámetro de límite define el tamaño máximo del archivo de registro en bytes, después de lo cual se creará un nuevo archivo de registro. El parámetro append estipula si se debe permitir agregar si el nombre de archivo existe. El parámetro de patrón define el nombre del archivo de registro.

SocketHandler: este controlador escribe registros en un socket HTTP. Esto puede ser útil cuando necesite almacenar los registros en otra instancia o servicio que no sea el que ya se está ejecutando. El formato predeterminado que se utiliza aquí es XMLFormatter.

StreamHandler: este controlador escribe la salida en un OutputStream que luego se puede usar para escribir en cualquier destino. Este controlador es una clase base que actúa como base en caso de que sea necesario definir un controlador personalizado basado en un destino diferente. Definirlo es tan fácil como configurar el controlador en el archivo de propiedades.

MemoryHandler: este controlador escribe todas las entradas de registro en un búfer circular en memoria. Escribe en el búfer de memoria si un registro entrante tiene un nivel superior al predefinido o si cumple condiciones específicas. Estas condiciones se pueden personalizar implementando una clase que anula la función de registro. La nueva función puede escanear todos los registros y decidir cuándo escribir. Este controlador se usa a menudo porque, en términos de rendimiento, el almacenamiento en búfer es económico mientras que el formateo es costoso. Al usar este controlador, los costos de formateo se difieren hasta que se necesite escribir.

Los controladores son un área en la que los marcos de registro de terceros funcionan mejor que la API de registro predeterminada. Por ejemplo, Log4j 2 proporciona muchos controladores que se usan comúnmente en una configuración empresarial. Por ejemplo, SysLogAppender escribe entradas en el registro del sistema operativo (como syslog) o en un servidor de agregación de registros.

Los niveles de registro ayudan a los desarrolladores a clasificar los registros según su importancia. Esto es muy útil al migrar código a través de diferentes entornos, como desarrollo, ensayo o producción. En el entorno de desarrollo, es posible que los desarrolladores deseen obtener toda la información que puedan para depurar o probar. Una vez que el código se implementa en producción, es posible que el equipo de operaciones desee recibir notificaciones solo sobre eventos de registro GRAVES. El marco de registro de Java admite siete niveles de registro. Por lo general, las aplicaciones utilizan los siguientes en orden creciente de gravedad:

Establecer un nivel de registro cuando se inicializa la clase Logger ayuda a los desarrolladores a filtrar todos los registros por debajo de ese nivel. Por ejemplo, cuando el nivel de registro se establece en INFO, solo se generarán los eventos etiquetados como INFO, ADVERTENCIA o SEVERO. Puede establecer el nivel de registro con un comando simple:

La función de registro permite definir el nivel de las entradas de registro persistentes.

En esta primera parte de nuestra descripción general, hemos cubierto los conceptos básicos del marco de registro predeterminado de Java. Si bien el marco proporciona todas las funciones básicas necesarias para el registro a nivel de aplicación, las funciones avanzadas requieren que los desarrolladores escriban controladores personalizados. Los marcos de trabajo de registro de terceros como Log4j 2 o Logback amplían el conjunto de funciones y eliminan la necesidad de que un desarrollador realice un desarrollo personalizado.

En la segunda parte de esta serie, aprenderemos sobre conceptos avanzados en el registro de Java, incluido el manejo de excepciones, los formateadores y la agregación de registros.

Arfan Sharif es líder de marketing de productos para la cartera de Observabilidad en CrowdStrike. Tiene más de 15 años de experiencia impulsando soluciones de gestión de registros, ITOps, observabilidad, seguridad y CX para empresas como Splunk, Genesys y Quest Software. Arfan se graduó en Ciencias de la Computación en la Universidad Bucks and Chilterns y tiene una carrera que abarca marketing de productos e ingeniería de ventas.

Guía de registro de Java Explore la serie completa de la Guía de registro de Java: Registradores: Controladores: Formateador: ConsoleHandler:
COMPARTIR