Log4j

Apache log4j
Información general
Tipo de programa herramienta de registro
Desarrollador Apache Software Foundation
Licencia licencia Apache 2.0
Idiomas inglés
Información técnica
Programado en Java
Plataformas admitidas Java
Versiones
Última versión estable 2.17.2 (28 de febrero de 2022 (4 años, 8 meses y 3 días))
Enlaces

Log4j es una biblioteca de código abierto desarrollada en Java por la Apache Software Foundation que permite a los desarrolladores de software escribir mensajes de registro, cuyo propósito es dejar constancia de una determinada transacción en tiempo de ejecución. Log4j permite filtrar los mensajes en función de su importancia. La configuración de salida y granularidad de los mensajes es realizada en tiempo de ejecución mediante el uso de archivos de configuración externos. Log4J ha sido implementado en otros lenguajes como C, C++, C#, Perl, Python, Ruby y Eiffel.

Historia

Log4j es un proyecto de la Apache Software Foundation que fue escrito por Ceki Gülcü. Log4j es uno de los varios Java Logging Frameworks existentes.

Gülcü ha comenzado los proyectos SLF4J y Logback, con la intención de ofrecer un sucesor a log4j.

Conceptos

Niveles de prioridad de los mensajes

Por defecto Log4J tiene seis niveles de prioridad para los mensajes: trace, debug, info, warn, error y fatal. Además existen otros dos niveles extras, all y off.

Niveles de prioridad (de menor a mayor):

Anexos

En Log4J los mensajes son enviados a una (o varias) salida de destino, lo que se denomina un appender.

Existen varios appenders disponibles y configurados, aunque también podemos crear y configurar nuestros propios appenders.

Típicamente la salida de los mensajes es redirigida a un fichero de texto .log (FileAppender, RollingFileAppender), a un servidor remoto donde almacenar registros (SocketAppender), a una dirección de correo electrónico (SMTPAppender), e incluso en una base de datos (JDBCAppender).

Casi nunca es utilizado en un entorno de producción la salida a la consola (ConsoleAppender) ya que perdería gran parte de la utilidad de Log4J.

Disposiciones

Permite presentar el mensaje con el formato necesario para almacenarlo simplemente en un archivo de texto de extensión «.log» (SimpleLayout y PatternLayout), en una tabla HTML (HTMLLayout), o en un archivo XML (XMLLayout).

Además se puede añadir información extra al mensaje, como la fecha en que se generó, la clase que lo generó o el nivel que posee, entre otro, por cada paso

Configuración

La API es totalmente configurable, ya que se realiza mediante un archivo en formato XML o en formato Java Properties (clave=valor), generalmente llamado log4j.properties.

En el siguiente ejemplo implementamos un fichero properties de configuración, y configuramos dos registros.

 ################################################################
 ### Configuración para LOCAL                                 ###
 ################################################################
 #log4j.rootCategory=DEBUG, LOGFILE, CONSOLE 
 
 #log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
 
 #log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
 #log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
 #log4j.appender.CONSOLE.layout.ConversionPattern=%-5p %c %x - %m%n 
 
 
 ################################################################
 ### Configuración para DESARROLLO, PREPRODUCCION, PRODUCCION ###
 ###   Sólo nos interesa el nivel de ERROR    		       ###
 ###   No hay salida de consola			       ###
 ################################################################
 log4j.rootCategory=ERROR, diario
 
 
 ################################################################
 ### Configuración Común		  		       ###
 ################################################################
 log4j.appender.LOGFILE=org.apache.log4j.DailyRollingFileAppender
 log4j.appender.LOGFILE.file=${catalina.base}/logs/aplicacion.log
 log4j.appender.LOGFILE.append=true
 log4j.appender.LOGFILE.DatePattern='.'yyyy-MM-dd
 
 log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
 log4j.appender.LOGFILE.layout.ConversionPattern=%-4r [%t] %-5p %c - %m%n

Uso

Para utilizarlo debemos por supuesto importar las clases que necesitamos de Log4J en nuestro código.

A continuación debemos definir una variable estática del tipo org.apache.log4j.Logger con el nombre de la clase que va a escribir en el registro.

Finalmente debemos configurar el objeto Logger.

Un ejemplo para esta última opción:

 private static org.apache.log4j.Logger registro;
 		try {
 			URL url = Loader.getResource("log4j.properties");
 			PropertyConfigurator.configure(url);
 			registro = Logger.getLogger(CreaTrazas.class);
 System.out.println ("[" + url.toString() + "] Logger inicializado.");
 		} catch (Exception e) {
 			BasicConfigurator.configure();
 			registro = Logger.getLogger(CreaTrazas.class);
 System.out.println ("Excepción al inicializar el log: " + e.toString());
 		}

Lo más útil y flexible en los entornos empresariales reales es utilizar la última opción (archivos de configuración).

Vulnerabilidad «Log4Shell»

El 24 de noviembre de 2021, investigadores independientes de seguridad informática informaron a Apache sobre una vulnerabilidad tipo ataque de día cero que permitía la ejecución de código arbitrario en Log4j versión 2, denominada Log4Shell (CVE-2021-44228). Fue publicada a través de un tuit el 9 de diciembre de 2021.[cita requerida] Los servicios afectados incluyeron Cloudflare, iCloud, Minecraft (Java Edition), Steam, Tencent QQ, y Twitter. La Apache Software Foundation asignó a la vulnerabilidad la severidad CVSS máxima de 10, por la posibilidad de que millones de servidores fueran potencialmente vulnerables a ciberataques.

La vulnerabilidad apareció en las versiones de la 2.0-alpha1 hasta 2.16.0, y fue mitigada con la versión 2.17.0. Los usuarios y desarrolladores de los programas que usen la biblioteca deben actualizarla para obtener las actualizaciones de seguridad.

El riesgo de esta vulnerabilidad es que es relativamente fácil explotarla, por lo que para las organizaciones es importante revisar si están expuestas a este riesgo, existen diferentes pruebas de concepto que muestran la vulnerabilidad que pueden servir de base para evaluar el riesgo.

Proyectos similares

Referencias

  1. ↑ (en inglés) Sitio web de Logback
  2. ↑ «Log4j – Apache Log4j Security Vulnerabilities». logging.apache.org. Consultado el 21 de diciembre de 2021.
  3. ↑ Nathaniel Mott (10 de deciembre, 2021). «Countless Servvers Are Vulnerable to Apache Log4j Zero-Day Exploit».
  4. ↑ «Log4j – Apache Log4j Security Vulnerabilities». logging.apache.org. Consultado el 19 de diciembre de 2021.
  5. ↑ Prueba de concepto Log4Shell

Véase también

Enlaces externos

Implementaciones