log4j es un marco de registro (API) confiable, rápido y flexible escrito en Java, que se distribuye bajo la licencia de software Apache.
log4j se ha adaptado a los lenguajes C, C ++, C #, Perl, Python, Ruby y Eiffel.
log4j es altamente configurable a través de archivos de configuración externos en tiempo de ejecución. Ve el proceso de registro en términos de niveles de prioridades y ofrece mecanismos para dirigir la información de registro a una gran variedad de destinos, como una base de datos, archivo, consola, UNIX Syslog, etc.log4j tiene tres componentes principales:
registradores: Responsables de capturar información de registro.
appenders: Responsable de publicar información de registro en varios destinos preferidos.
layouts: Responsable de formatear la información de registro en diferentes estilos.
Las siguientes son características de log4j:
Es seguro para subprocesos.
Está optimizado para la velocidad.
Se basa en una jerarquía de registradores con nombre.
Admite múltiples agregadores de salida por registrador.
Apoya la internacionalización.
No está restringido a un conjunto predefinido de instalaciones.
El comportamiento de registro se puede configurar en tiempo de ejecución mediante un archivo de configuración.
Está diseñado para manejar excepciones de Java desde el principio.
Utiliza múltiples niveles, a saber, TODOS, RASTREO, DEPURACIÓN, INFORMACIÓN, ADVERTENCIA, ERROR y FATAL.
El formato de la salida del registro se puede cambiar fácilmente ampliando la clase Layout.
El objetivo de la salida del registro, así como la estrategia de escritura, pueden modificarse mediante implementaciones de la interfaz Appender.
Es una parada de emergencia. Sin embargo, aunque ciertamente se esfuerza por garantizar la entrega, log4j no garantiza que cada declaración de registro se envíe a su destino.
Los siguientes son los pros y los contras de la tala:
El registro es un componente importante del desarrollo de software. Un código de registro bien escrito ofrece una depuración rápida, un mantenimiento sencillo y un almacenamiento estructurado de la información en tiempo de ejecución de una aplicación.
La tala también tiene sus inconvenientes. Puede ralentizar una aplicación. Si es demasiado detallado, puede causar ceguera de desplazamiento. Para aliviar estas preocupaciones, log4j está diseñado para ser confiable, rápido y extensible.
Dado que el registro rara vez es el enfoque principal de una aplicación, la API de log4j se esfuerza por ser simple de entender y usar.
Objeto de registrador: la capa de nivel superior de la arquitectura log4j es el registrador que proporciona el objeto de registrador. El objeto Logger es responsable de capturar la información de registro y se almacena en una jerarquía de espacio de nombres.
Objeto de diseño: la capa de diseño de la arquitectura log4j proporciona objetos que se utilizan para formatear la información de registro en diferentes estilos. Proporciona soporte a los objetos añadidos antes de publicar la información de registro.
Los objetos de diseño juegan un papel importante en la publicación de información de registro de una manera que sea legible y reutilizable.
Objeto Appender: esta es una capa de nivel inferior de la arquitectura log4j que proporciona objetos Appender. El objeto Appender es responsable de publicar información de registro en varios destinos preferidos, como una base de datos, un archivo, una consola, UNIX Syslog, etc.
Objeto de nivel: el objeto de nivel define la granularidad y la prioridad de cualquier información de registro. Hay siete niveles de registro definidos dentro de la API: OFF, DEBUG, INFO, ERROR, WARN, FATAL y ALL.
Objeto de filtro: el objeto de filtro se utiliza para analizar la información de registro y tomar decisiones adicionales sobre si esa información debe registrarse o no. Un objeto Appender puede tener varios objetos Filter asociados con ellos. Si la información de registro se pasa a un objeto de Appender en particular, todos los objetos de filtro asociados con ese Appender deben aprobar la información de registro antes de que pueda publicarse en el destino adjunto.
ObjectRenderer: el objeto ObjectRenderer está especializado en proporcionar una representación de cadena de diferentes objetos pasados al marco de registro. Los objetos Layout utilizan este objeto para preparar la información de registro final.
LogManager: el objeto LogManager administra el marco de registro. Es responsable de leer los parámetros de configuración inicial de un archivo de configuración de todo el sistema o una clase de configuración.
El archivo log4j.properties es un archivo de configuración log4j que mantiene las propiedades en pares clave-valor. De forma predeterminada, LogManager busca un archivo llamado log4j.properties en CLASSPATH.
layout: Appender utiliza los objetos Layout y el patrón de conversión asociado con ellos para formatear la información de registro.
target: el destino puede ser una consola, un archivo u otro elemento, según el appender.
level: el nivel es necesario para controlar el filtrado de los mensajes de registro.
umbral: el appender puede tener un nivel de umbral asociado independientemente del nivel del registrador. El Appender ignora cualquier mensaje de registro que tenga un nivel inferior al nivel de umbral.
filter: los objetos Filter pueden analizar la información de registro más allá de la coincidencia de nivel y decidir si las solicitudes de registro deben ser manejadas por un Appender particular o ignoradas.
La siguiente sintaxis define el registrador raíz con el archivo adjunto:
# Define the root logger with appender file
log = /usr/home/log4j
log4j.rootLogger = DEBUG, FILE
La siguiente sintaxis define un appender de archivos:
# Define the file appender
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=${log}/log.out
La siguiente sintaxis define el diseño del appender de archivos:
# Define the layout for file appender
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.conversionPattern=%m%n
Cualquier otra instancia de objeto Logger con nombre se obtiene a través del segundo método pasando el nombre del registrador. El nombre del registrador puede ser cualquier cadena que pueda pasar, generalmente una clase o un nombre de paquete como lo hemos usado en el último capítulo y se menciona a continuación:
static Logger log = Logger.getLogger(log4jExample.class.getName());
public void debug (Object message) de la clase Logger imprime mensajes con el nivel Level.DEBUG.
El error public void (mensaje de objeto) de la clase Logger imprime mensajes con el nivel Level.ERROR.
public void fatal (Object message) de la clase Logger imprime mensajes con el nivel Level.FATAL.
public void info (mensaje de objeto) de la clase Logger imprime mensajes con el nivel Level.INFO.
public void warn (mensaje de objeto) de la clase Logger imprime mensajes con el nivel Level.WARN.
El rastro de vacío público (mensaje de objeto) de la clase Logger imprime mensajes con el nivel Level.TRACE.
TODOS: todos los niveles, incluidos los niveles personalizados.
DEBUG: designa eventos informativos detallados que son más útiles para depurar una aplicación.
ERROR: designa eventos de error que aún pueden permitir que la aplicación continúe ejecutándose.
FATAL: designa eventos de error muy graves que presumiblemente harán que la aplicación se anule.
INFO: designa mensajes informativos que destacan el progreso de la aplicación a un nivel más detallado.
APAGADO: el rango más alto posible y está diseñado para desactivar el registro.
TRACE: designa eventos informativos más detallados que el DEBUG.
ADVERTENCIA: designa situaciones potencialmente dañinas.
Se habilita una solicitud de registro de nivel p en un registrador con nivel q si p> = q. Esta regla está en el corazón de log4j. Asume que los niveles están ordenados. Para los niveles estándar, tenemos TODOS <DEBUG <INFO <WARN <ERROR <FATAL <OFF.
La siguiente sintaxis define el registrador raíz con el modo WARN desactivando el modo DEBUG.
# Define the root logger with appender file
log = /usr/home/log4j
log4j.rootLogger = WARN, FILE
Si desea generar su información de registro en un formato particular basado en un patrón, entonces puede usar org.apache.log4j.PatternLayout para formatear su información de registro.
La clase PatternLayout extiende la clase abstracta org.apache.log4j.Layout y anula el método format () para estructurar la información de registro de acuerdo con un patrón proporcionado.
c: se utiliza para generar la categoría del evento de registro. Por ejemplo, para el nombre de categoría "abc", el patrón% c {2} generará "bc".
C: se utiliza para generar el nombre de clase completamente calificado de la persona que llama que emite la solicitud de registro. Por ejemplo, para el nombre de la clase. "org.apache.xyz.SomeClass", el patrón% C {1} generará "SomeClass".
d: se utiliza para generar la fecha del evento de registro. Por ejemplo,% d {HH: mm: ss, SSS} o% d {dd MMM aaaa HH: mm: ss, SSS}.
F: se utiliza para generar el nombre del archivo donde se emitió la solicitud de registro.
l: se utiliza para generar información sobre la ubicación de la persona que llama que generó el evento de registro.
L: se utiliza para generar el número de línea desde donde se emitió la solicitud de registro.
m: se utiliza para generar el mensaje proporcionado por la aplicación asociado con el evento de registro.
M: se utiliza para generar el nombre del método donde se emitió la solicitud de registro.
n: genera el carácter o caracteres separadores de línea dependientes de la plataforma.
p: se utiliza para generar la prioridad del evento de registro.
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 utiliza para generar el nombre del hilo que generó el 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: el carácter de conversión X va seguido de la clave del MDC. Por ejemplo, X {clientIP} imprimirá la información almacenada en el MDC contra la clave clientIP.
%: El signo de porcentaje literal. %% imprimirá un signo%.
De forma predeterminada, la información relevante se muestra como salida tal cual. Sin embargo, con la ayuda de modificadores de formato, es posible cambiar el ancho mínimo del campo, el ancho máximo del campo y la justificación.
% 20c: almohadilla izquierda con espacios si el nombre de la categoría tiene menos de 20 caracteres.
% -20c: almohadilla derecha con espacios si el nombre de la categoría tiene menos de 20 caracteres.
% .30c: se trunca desde el principio si el nombre de la categoría tiene más de 30 caracteres.
% 20.30c: almohadilla izquierda con espacios si el nombre de la categoría tiene menos de 20 caracteres. Sin embargo, si el nombre de la categoría tiene más de 30 caracteres, trunque desde el principio.
% -20.30c: almohadilla derecha con espacios si el nombre de la categoría tiene menos de 20 caracteres. Sin embargo, si el nombre de la categoría tiene más de 30 caracteres, trunque desde el principio.
Si desea generar su información de registro en un archivo con formato HTML, puede usar org.apache.log4j.HTMLLayout para formatear su información de registro.
La clase HTMLLayout extiende la clase abstracta org.apache.log4j.Layout y reemplaza el método format () de su clase base para proporcionar formato de estilo HTML.
Proporciona la siguiente información para mostrar:
El tiempo transcurrido desde el inicio de la aplicación antes de que se generara un evento de registro en particular.
El nombre del hilo que invocó la solicitud de registro.
El nivel asociado con esta solicitud de registro.
El nombre del registrador y el mensaje de registro.
La información de ubicación opcional para el archivo de programa y el número de línea desde el que se invocó este registro.
HTMLLayout.setContentType (String): establece el tipo de contenido del contenido HTML. El valor predeterminado es texto / html.
HTMLLayout.setLocationInfo (String): establece la información de ubicación para el evento de registro. El valor predeterminado es falso.
HTMLLayout.setTitle (String): establece el título del archivo HTML. El valor predeterminado es log4j Log Messages.
InmediatoFlush: este indicador se establece de forma predeterminada en verdadero, lo que significa que el flujo de salida del archivo se vacía con cada operación de adición.
codificación: es posible utilizar cualquier codificación de caracteres. De forma predeterminada, es el esquema de codificación específico de la plataforma.
umbral: el nivel de umbral para este appender.
Nombre de archivo: el nombre del archivo de registro.
fileAppend: de forma predeterminada, se establece en verdadero, lo que significa que la información de registro se agrega al final del mismo archivo.
bufferedIO: esta bandera indica si necesitamos la escritura en búfer habilitada. De forma predeterminada, se establece en falso.
bufferSize: si la E / S almacenada en búfer está habilitada, indica el tamaño del búfer. De forma predeterminada, está configurado en 8 kb.
El siguiente código configura el vaciado inmediato a verdadero:
# Set the immediate flush to true (default)
log4j.appender.FILE.ImmediateFlush=true
El siguiente código establece el umbral para el modo de depuración:
# Set the threshold to debug mode
log4j.appender.FILE.Threshold=debug
El siguiente código establece el anexo en falso, sobrescribe -
# Set the append to false, overwrite
log4j.appender.FILE.Append=false
Para escribir su información de registro en varios archivos, tendría que usar la clase org.apache.log4j.RollingFileAppender que extiende la clase FileAppender y hereda todas sus propiedades.
Este es el tamaño crítico del archivo por encima del cual se desplazará el archivo.
El valor predeterminado es 10 MB.
Esta propiedad denota la cantidad de archivos de respaldo que se crearán.
El valor predeterminado es 1.
El siguiente código configura un RollingFileAppender -
# Define the root logger with appender file
log4j.rootLogger = DEBUG, FILE
# Define the file appender
log4j.appender.FILE=org.apache.log4j.RollingFileAppender
El siguiente código configura el tamaño máximo de archivo antes de la sustitución:
# Set the maximum file size before rollover
log4j.appender.FILE.MaxFileSize=5KB
El siguiente código configura el máximo de archivos que se utilizarán:
# Set the the backup index
log4j.appender.FILE.MaxBackupIndex=2
Se creará un nuevo archivo de registro.
Una vez que el último archivo de registro alcanza el tamaño máximo, el primer archivo de registro se borrará y, a partir de entonces, toda la información de registro se revertirá al primer archivo de registro.
Para escribir su información de registro en archivos a diario, tendría que usar la clase org.apache.log4j.DailyRollingFileAppender que extiende la clase FileAppender y hereda todas sus propiedades.
Esto indica cuándo pasar el archivo y la convención de nomenclatura que se debe seguir. De forma predeterminada, la renovación se realiza a la medianoche todos los días.
'.' aaaa-MM: rollover al final de cada mes y al comienzo del mes siguiente.
'.' aaaa-MM-dd: pase a la medianoche todos los días. Este es el valor predeterminado.
'.' aaaa-MM-dd-a - Pasa al mediodía y a la medianoche de cada día.
'.' aaaa-MM-dd-HH: pase el cursor al principio de cada hora.
'.' aaaa-MM-dd-HH-mm - Pasa el cursor cada minuto.
'.' aaaa-ww: Pasa el cursor el primer día de cada semana, según la ubicación.
El siguiente código configura un DailyRollingFileAppender -
# Define the root logger with appender file
log4j.rootLogger = DEBUG, FILE
# Define the file appender
log4j.appender.FILE = org.apache.log4j.DailyRollingFileAppender
El siguiente código configura un DatePattern -
# Set the DatePattern
log4j.appender.FILE.DatePattern = '.' yyyy-MM-dd-a
La API log4j proporciona el objeto org.apache.log4j.jdbc.JDBCAppender, que puede colocar información de registro en una base de datos específica.
controlador: establece la clase de controlador en la cadena especificada. Si no se especifica ninguna clase de controlador, el valor predeterminado es sun.jdbc.odbc.JdbcOdbcDriver.
contraseña: establece la contraseña de la base de datos.
sql: especifica la instrucción SQL que se ejecutará cada vez que se produzca un evento de registro. Esto podría ser INSERT, UPDATE o DELETE.
URL: establece la URL de JDBC.
usuario: establece el nombre de usuario de la base de datos.