Log4j - Log4j

Apache Log4j
Apache Log4j Logo.png
Desarrollador (es) Fundación de software Apache
Versión inicial 8 de enero de 2001 ; hace 20 años  ( 08/01/2001 )
Lanzamiento estable
2.14.1 / 6 de marzo de 2021 ; Hace 9 días  (6 de marzo de 2021 )
Repositorio Repositorio Log4j
Escrito en Java
Sistema operativo Multiplataforma
Escribe Inicio sesión
Licencia Licencia Apache 2.0
Sitio web registro .apache .org / log4j / 2 .x /

Apache Log4j es una utilidad de registro basada en Java . Fue escrito originalmente por Ceki Gülcü y es parte del proyecto Apache Logging Services de Apache Software Foundation . Log4j es uno de varios marcos de registro de Java .

Desde entonces, Gülcü ha iniciado los proyectos SLF4J y Logback, con la intención de ofrecer un sucesor de Log4j.

El equipo de Apache Log4j ha creado un sucesor de Log4j 1 con la versión número 2. Log4j 2 se desarrolló con un enfoque en los problemas de Log4j 1.2, 1.3, java.util.logging y Logback, y aborda los problemas que aparecían en esos marcos. Además, Log4j 2 ofrece una arquitectura de complementos que lo hace más extensible que su predecesor. Log4j 2 no es compatible con versiones anteriores de las versiones 1.x, aunque hay un "adaptador" disponible.

El 5 de agosto de 2015, el Comité de Gestión de Proyectos de Servicios de Registro de Apache anunció que Log4j 1 había llegado al final de su vida útil y que se recomienda a los usuarios de Log4j 1 que se actualicen a Apache Log4j 2.

Apache Log4j 2

Apache Log4j 2 es el sucesor de Log4j 1, que se lanzó como versión GA en julio de 2014. El marco se reescribió desde cero y se inspiró en las soluciones de registro existentes, incluidos Log4j 1 y java.util.logging. Las principales diferencias con Log4j 1 son:

  • Fiabilidad mejorada. Los mensajes no se pierden al reconfigurar el marco como en Log4j 1 o Logback
  • Extensibilidad: Log4j 2 admite un sistema de complementos para permitir a los usuarios definir y configurar componentes personalizados
  • Sintaxis de configuración simplificada
  • Soporte para xml, json, yaml y configuraciones de propiedades
  • Filtros mejorados
  • Soporte de búsqueda de propiedades para valores definidos en el archivo de configuración, propiedades del sistema, variables de entorno, ThreadContext Map y datos presentes en el evento.
  • Compatibilidad con varias API: Log4j 2 se puede utilizar con aplicaciones que utilizan las API Log4j 2, Log4j 1.2, SLF4J, Commons Logging y java.util.logging (JUL).
  • Niveles de registro personalizados
  • Compatibilidad con lambda de estilo Java 8 para "registro diferido"
  • Marcadores
  • Soporte para objetos de mensaje definidos por el usuario
  • "Basura libre o baja basura" en configuraciones comunes
  • Velocidad mejorada

Una de las características más reconocidas de Log4j 2 es el rendimiento de los "registradores asíncronos". Log4j 2 hace uso del LMAX Disruptor . La biblioteca reduce la necesidad de bloqueo del kernel y aumenta el rendimiento del registro en un factor de 12. Por ejemplo, en el mismo entorno, Log4j 2 puede escribir más de 18,000,000 de mensajes por segundo, mientras que otros marcos como Logback y Log4j 1 solo escriben <2,000,000 de mensajes por segundo.

Niveles de registro log4j

La siguiente tabla define los mensajes y niveles de registro integrados en Log4j, en orden decreciente de gravedad. La columna de la izquierda enumera la designación del nivel de registro en Log4j y la columna de la derecha proporciona una breve descripción de cada nivel de registro.

Nivel Descripción
APAGADO El rango más alto posible y está destinado a desactivar el registro.
FATAL Errores graves que provocan la terminación prematura. Espere que sean visibles de inmediato en una consola de estado.
ERROR Otros errores de tiempo de ejecución o condiciones inesperadas. Espere que sean visibles de inmediato en una consola de estado.
ADVERTIR Uso de API en desuso, mal uso de API, "casi" errores, otras situaciones de tiempo de ejecución que son indeseables o inesperadas, pero no necesariamente "incorrectas". Espere que sean visibles de inmediato en una consola de estado.
INFO Eventos interesantes en tiempo de ejecución (inicio / apagado). Espere que sean visibles de inmediato en una consola, así que sea conservador y manténgalo al mínimo.
DEPURAR Información detallada sobre el flujo a través del sistema. Espere que se escriban solo en registros. En términos generales, la mayoría de las líneas registradas por su aplicación deben escribirse como DEBUG.
RASTRO Información más detallada. Espere que se escriban solo en registros. Desde la versión 1.2.12.

Niveles de registro personalizados

Log4j 2 permite a los usuarios definir sus propios niveles de registro. Se proporciona una herramienta generadora de código fuente para crear registradores que admitan niveles de registro personalizados de manera idéntica a los niveles de registro integrados. Los niveles de registro personalizados pueden complementar o reemplazar los niveles de registro integrados.

Configuración de Log4j

Log4j se puede configurar mediante un archivo de configuración o mediante código Java. Los archivos de configuración se pueden escribir en formato XML , JSON , YAML o de archivo de propiedades . Dentro de una configuración puede definir tres componentes principales: registradores, anexos y diseños. Configurar el registro a través de un archivo tiene la ventaja de que el registro se puede activar o desactivar sin modificar la aplicación que usa Log4j. Se puede permitir que la aplicación se ejecute con el cierre de sesión hasta que haya un problema, por ejemplo, y luego se puede volver a activar el registro simplemente modificando el archivo de configuración.

Los registradores se denominan destinos de mensajes de registro. Son los nombres que conoce la aplicación Java. Cada registrador se puede configurar de forma independiente en cuanto al nivel de registro (FATAL, ERROR, etc.) que registra actualmente. En las primeras versiones de Log4j, estos se llamaban categoría y prioridad, pero ahora se llaman registrador y nivel, respectivamente. Un registrador puede enviar mensajes de registro a varios Appenders.

Las salidas reales son hechas por appenders . Hay numerosos Appenders disponibles, con nombres descriptivos, como FileAppender, RollingFileAppender, ConsoleAppender, SocketAppender, SyslogAppender y SMTPAppender. Log4j 2 agregó Appenders que escriben en Apache Flume , la API de persistencia de Java , Apache Kafka , bases de datos NoSQL , archivos asignados en memoria, archivos de acceso aleatorio y puntos finales ZeroMQ . Se pueden adjuntar múltiples agregadores a cualquier registrador, por lo que es posible registrar la misma información en múltiples salidas; por ejemplo, a un archivo localmente y a un escucha de socket en otra computadora.

Los anexos utilizan diseños para formatear las entradas del registro. Una forma popular de formatear archivos de registro de una línea a la vez es PatternLayout, que usa una cadena de patrón, muy parecida a la función printf de C / C ++ . También hay formateadores HTMLLayout y XMLLayout para usar cuando los formatos HTML o XML son más convenientes, respectivamente. Log4j 2 agregó diseños para CSV , Graylog Extended Log Format (GELF), JSON , YAML y RFC-5424.

En Log4j 2, los filtros se pueden definir en elementos de configuración para brindar un control más detallado sobre qué entradas de registro deben ser procesadas por qué registradores y appenders. Además de filtrar por nivel de registro y coincidencia de expresiones regulares en la cadena del mensaje, Log4j 2 agregó filtros de ráfaga, filtros de tiempo, filtrado por otros atributos de eventos de registro como marcadores o mapa de contexto de subprocesos y filtros de script JSR 223 .

Para depurar una configuración que no funciona correctamente:

  • En las configuraciones de Log4j 2, establezca el status atributo en TRACE para enviar la salida de registro de estado interno a la salida estándar . Para habilitar el registro de estado antes de que se encuentre la configuración, use la propiedad Java VM -Dorg.apache.logging.log4j.simplelog.StatusLogger.level=trace .
  • En Log4j 1, use la propiedad Java VM -Dlog4j.debug .

Para averiguar dónde se cargó un archivo de configuración log4j2.xml desde inspect getClass().getResource("/log4j2.xml") .

También hay una configuración implícita "no configurada" o "predeterminada" de Log4j, la de una aplicación Java instrumentada con Log4j que carece de configuración de Log4j. Esto imprime una advertencia estándar de que el programa no está configurado y la URL del sitio web de Log4j, donde se pueden encontrar detalles sobre la advertencia y la configuración. Además de imprimir esta advertencia, una aplicación Log4j no configurada solo imprimirá las entradas de registro ERROR o FATAL en la salida estándar.

Ejemplo para Log4j 2

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="trace" monitorInterval="60">
  <Properties>
    <Property name="filename">target/test.log</Property>
  </Properties>
 
  <Appenders>
    <Console name="STDOUT">
      <PatternLayout pattern="%d %p %c{1.} [%t] %m%n"/>
    </Console>

    <File name="file" fileName="${filename}">
      <PatternLayout>
        <pattern>%d %p %c{1.} [%t] %m%n</pattern>
      </PatternLayout>
    </File>
  </Appenders>
 
  <Loggers> 
    <!-- 
         loggers whose name starts with 'org.springframework' will only log messages of level "info" or higher;
         if you retrieve Loggers by using the class name (e.g. Logger.getLogger(AClass.class))
         and if AClass is part of the org.springframework package, it will belong to this category
    -->
    <Logger name="org.springframework" level="info" additivity="false" />

    <!--
        Filter example: for loggers whose name starts with 'com.mycompany.myproduct',
        log entries of level "debug" or higher whose ThreadContextMap data contains
        the key-value pair "test=123", also send these log entries to the "STDOUT" appender.
    -->
    <Logger name="com.mycompany.myproduct" level="debug" additivity="true">
      <ThreadContextMapFilter>
        <KeyValuePair key="test" value="123"/>
      </ThreadContextMapFilter>
      <AppenderRef ref="STDOUT"/>
    </Logger>
 
    <!--
        By default, all log messages of level "trace" or higher will be logged.
        Log messages are sent to the "file" appender and 
        log messages of level "error" and higher will be sent to the "STDOUT" appender.
    -->
    <Root level="trace">
      <AppenderRef ref="file"/>
      <AppenderRef ref="STDOUT" level="error"/>
    </Root>
  </Loggers>
 
</Configuration>

Ejemplo de Log4j 1.2

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//LOGGER" "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">
<log4j:configuration>
    <!-- 
         an appender is an output destination, such as the console or a file;
         names of appenders are arbitrarily chosen.
    -->
    <appender name="stdout" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern"
                value="%d{ABSOLUTE} %5p %c{1}:%L - %m%n" />
        </layout>
    </appender>
 
    <!-- 
         loggers of category 'org.springframework' will only log messages of level "info" or higher;
         if you retrieve Loggers by using the class name (e.g. Logger.getLogger(AClass.class))
         and if AClass is part of the org.springframework package, it will belong to this category
    -->
    <logger name="org.springframework">
        <level value="info"/>
    </logger>

    <!-- 
         everything of spring was set to "info" but for class 
         PropertyEditorRegistrySupport we want "debug" logging 
    -->
    <logger name="org.springframework.beans.PropertyEditorRegistrySupport">
        <level value="debug"/>
    </logger>
 
    <logger name="org.acegisecurity">
        <level value="info"/>
    </logger>
    
    
    <root>
        <!-- 
            all log messages of level "debug" or higher will be logged, unless defined otherwise 
            all log messages will be logged to the appender "stdout", unless defined otherwise 
        -->
        <level value="debug" />
        <appender-ref ref="stdout" />
    </root>
</log4j:configuration>

TTCC

TTCC es un formato de mensaje utilizado por log4j. TTCC es un acrónimo de Time Thread Category Component . Utiliza el siguiente patrón:

 %r [%t] %-5p %c %x - %m%n

Dónde

Mnemotécnico Descripción
% r Se utiliza para generar la cantidad de milisegundos transcurridos desde la construcción del diseño hasta la creación del evento de registro.
% t Se usa para generar el nombre del hilo que generó el evento de registro.
%pag Se utiliza para generar la prioridad del evento de registro.
%C Se utiliza para generar la categoría del evento de registro.
%X Se utiliza para generar el NDC (contexto de diagnóstico anidado) asociado con el hilo que generó el evento de registro.
% X {clave} Se utiliza para generar el MDC (contexto de diagnóstico mapeado) asociado con el hilo que generó el evento de registro para la clave especificada.
%metro Se utiliza para generar el mensaje proporcionado por la aplicación asociado con el evento de registro.
%norte Se utiliza para generar el carácter o los caracteres de nueva línea específicos de la plataforma .

Salida de ejemplo
467 [main] INFO org.apache.log4j.examples.Sort - Saliendo del método principal.

Puertos

  • log4c : un puerto para C. Log4C es una biblioteca de registro basada en C , publicada en SourceForge bajo la licencia LGPL . Para varios sistemas operativos Unix , se proporcionan los archivos autoconf y automake . En Windows, se proporciona un archivo Makefile para su uso con MSVC . Los desarrolladores también pueden optar por utilizar su propio sistema de creación para compilar el código fuente, según los requisitos de ingeniería de su construcción. Una instancia de la biblioteca log4c se puede configurar a través de tres métodos: usando variables de entorno , programáticamente o mediante un archivo de configuración XML . log4c tiene anexos para archivos, flujos y archivos asignados en memoria. (Sin adaptador de enchufe). La última versión es 1.2.4, lanzada en 2013, y el proyecto ya no se desarrolla activamente.
  • log4js : un puerto para JavaScript . Log4js está disponible bajo la licencia de Apache Software Foundation . Una característica especial de Log4js es la capacidad de registrar los eventos del navegador de forma remota en el servidor. Usando Ajax es posible enviar los eventos de registro en varios formatos ( XML , JSON , ASCII simple , etc.) al servidor para ser evaluados allí. Los siguientes appenders se implementan para log4js : AjaxAppender, ConsoleAppender, FileAppender, JSConsoleAppender, MetatagAppender y WindowsEventsAppender. Se proporcionan las siguientes clases de diseño: BasicLayout, HtmlLayout, JSONLayout y XMLLayout. La última versión es 1.1, lanzada en 2008.
  • log4javascript : otro puerto para JavaScript. log4javascript es un marco de registro de JavaScript basado en log4j . La última versión es 1.4.9, lanzada en mayo de 2014.
  • JSNLog : un puerto para JavaScript . Coloca automáticamente los mensajes de los registradores de JavaScript en los registros del lado del servidor utilizando un componente del lado del servidor .NET que interactúa con Log4Net, NLog, Elmah o Common.Logging. Esto para proporcionar un registro integrado para los eventos del lado del cliente y del servidor. Los ID de solicitud correlacionan eventos relacionados con un usuario específico. La configuración se realiza a través de un archivo web.config del lado del servidor. Admite el registro de excepciones, incluidos los seguimientos de pila. En julio de 2014, la última versión era la 2.7.1 y se actualizaban periódicamente.
  • Apache Log4net : un puerto para Microsoft .NET Framework . El trabajo inicial fue realizado por Neoworks y fue donado a la Apache Software Foundation en febrero de 2004. El marco es similar al log4j original mientras aprovecha las nuevas características en el tiempo de ejecución de .NET. Proporciona contexto de diagnóstico anidado (NDC) y contexto de diagnóstico mapeado (MDC). La última versión es 2.0.8 que se lanzó en 2017.
  • log4perl : un puerto Perl del popular paquete de registro log4j. La última versión es 1.49, lanzada en febrero de 2017.
  • Apache log4php - "Un marco de registro versátil para PHP . Originalmente un puerto de Apache log4j a PHP, ha crecido para incluir varias características específicas de PHP".
  • PL-SQL-Logging-Utility es una adaptación de log4j en PL / SQL.
  • Log4db2 es una utilidad de registro para DB2 para LUW que usa instrucciones SQL con código SQL PL.
  • Apache Log4cxx : un marco de registro para C ++ con el patrón de Apache log4j, que usa Apache Portable Runtime para la mayoría de los códigos específicos de la plataforma y debería poder usarse en cualquier plataforma compatible con APR. Actualmente se encuentra en incubación, la última versión es 0.10.0, lanzada en 2008.
  • Log4r : una biblioteca de registro completa y flexible escrita en Ruby para su uso en programas de Ruby. Se inspiró en muchas de las características del proyecto Apache Log4j y las proporciona.

Ver también

Referencias

Otras lecturas

enlaces externos