Durante la operación del proyecto, a menudo es necesario realizar la depuración funcional y rastrear y registrar el comportamiento del usuario. Algunas personas están acostumbradas a usar System.out, pero esto no se recomienda. Solo es fácil de usar, pero no es fácil de mantener y no tiene escalabilidad. En comparación con LOG4J, LOG4J puede controlar el destino, el formato de salida y el nivel de información de registro, etc., para que podamos controlar el proceso de generación de registros con más cuidado.
LOG4J2 es una actualización de LOG4J1, con mejoras significativas en el rendimiento y la funcionalidad, incluido el rendimiento mejorado en múltiples lecturas, soporte para marcadores de posición, recarga de archivos de configuración automática, etc.
1. Introducción
1. Descargue el paquete jar
virgina
<pendencies> <Spendency> <MoupRid> org.apache.logging.log4j </proupid> <artifactid> log4j-api </arfactid> <versión> 2.10.0 </version> </pendency> <epardency> <proupid> org.apache.logging.log4j </grupo) <Versión> 2.10.0 </Versión> </pendency> </pendencs>
2. Archivo de configuración
LOG4J contiene cuatro implementaciones de fábrica de configuración: JSON, YAML, Propiedades y XML. Este artículo presenta el método de uso común XML.
LOG4J tiene la capacidad de configurarse automáticamente durante la inicialización. Cuando se inicia log4j, ubicará todos los archivos que compiten con los nombres en el classpath, con orden de prioridad: log4j2-test.properties> log4j2-test.xml> log4j2.properties> log4j2.xml
3. Un ejemplo simple
Configuración XML:
<? xml versión = "1.0" encoding = "utf-8"?> <Configuration Status = "Warn"> <Appenders> <console name = "console" target = "system_out"> <patruthlayout patrón = " %d {hh: mm: ss.sss} [ %t] %-5level %logger {36}- %msg %n"/" <Roggers> <root nivel = "info"> <appenderRef ref = "console"/> </ root> </loggers> </figuration> Código Java:
Private static final logger logger = logManager.getLogger (myapp.class); @Test public void testLog4j () {logger.info ("¡Hola mundo!"); }}Información de la consola
22: 17: 47.146 [Principal] Información MyApp - ¡Hola mundo!
2. Introducción al módulo
<Configuración>
| propiedad | describir |
| monitoreo | Si el archivo se modifica, la configuración se volverá a cargar después del tiempo especificado. Unidades de segundos, el valor mínimo es 5 |
| paquetes | Una lista separada por comas de los nombres de paquetes utilizados para buscar complementos, como filtros personalizados, apertores, etc. El complemento solo se cargará una vez, por lo que debe reiniciar el proyecto si desea entrar en vigencia después de la modificación. |
| estado | El nivel de registro interno, que establece el valor para depurar, puede ver claramente el flujo de evento de registro completo en la consola. El registrador utilizado es org.apache.logging.log4j.core.logger |
| estricto | Se permite el formato XML estricto. La configuración de JSON no es compatible |
| verboso | Habilitar información de diagnóstico al cargar complemento |
<Appendientes>
LOG4J permite que las solicitudes de registro se impriman a múltiples destinos. En el idioma log4j, el destino de salida se llama Appender. Actualmente, los apéndices existen en consolas, archivos, servidores remotos de socket, Apache Flume, JMS, Daemons de Syslog Remote Unix y varias API de bases de datos. Lo siguiente presenta varios apéndices más utilizados. Si necesita saber más, puede consultarlo en el sitio web oficial.
1. ConsolePeppender
Salida a la consola, <SOCSOL>
Nombre de parámetro | tipo | describir |
filtrar | Filtrar | Filtrar |
disposición | Disposición | Formato de salida de registro |
Seguir | booleano | |
directo | booleano | |
nombre | Cadena | El nombre de Appender |
IgnorarExcepciones | booleano | Predeterminado Verdadero, ignorar las excepciones de escritura |
objetivo | Cadena | System_out o system_err, el valor predeterminado es system_out |
2. FileAppender
Salida a archivo, <Archivo>
parámetro | tipo | describir |
|---|---|---|
añadir | booleano | El valor predeterminado es verdadero y los nuevos registros se agregarán al final del archivo |
bufferedio | booleano | El valor predeterminado es verdadero, el uso de buffers puede mejorar significativamente el rendimiento |
amortiguación | intencionalmente | Cuando Bufferedio es verdadero, el tamaño del búfer de esta propiedad es 8192 bytes de forma predeterminada. |
Crear Udemand | booleano | Appender crea archivos a pedido. El Appender creará este archivo solo cuando un evento de registro pase a través de todos los filtros y se enruta al Appender. El valor predeterminado es falso |
filtrar | Filtrar | Un filtro para determinar si el evento debe ser manejado por este apéndice. Se pueden usar múltiples filtros con filtros compuestos |
Nombre del archivo | Cadena | El nombre del archivo a escribir. Si el archivo o cualquiera de sus directorios de padres no existe, se creará |
inmediato | booleano | Por defecto, es cierto, habrá una actualización después de cada escritura. Esto asegurará que los datos del búfer se escriban en el disco, pero pueden afectar el rendimiento. |
disposición | Disposición | Formato de registro |
cierre | booleano | Bloqueo de archivo, predeterminado falso |
nombre | Cadena | El nombre de Appender |
IgnorarExcepciones | booleano | Predeterminado Verdadero, ignorar las excepciones de escritura |
FilEpermissions | Cadena | Definir permisos de archivo Ejemplo: RW ------ o RW-RW-RW- etc ... |
propietario | Cadena | Definir propietario del archivo |
grupo de archivos | Cadena | Definir grupos de archivos |
3. Jdbcaappender
JDBCappender usa JDBC estándar para escribir eventos de registro en tablas de bases de datos relacionales. Se puede configurar para obtener una conexión JDBC utilizando una fuente de datos JNDI o un método de fábrica personalizado. Independientemente del método, debe ser compatible con el grupo de conexión.
De lo contrario, el rendimiento de registro se verá muy afectado.
Si el controlador JDBC configurado admite declaraciones por lotes y configura el tamaño del búfer en un número positivo, el evento de registro será por lotes.
(1) <JDBC>
parámetro | tipo | describir |
|---|---|---|
nombre | Cadena | Debe, nombre de Appender |
IgnorarExcepciones | booleano | Verdadero predeterminado, ignorar las excepciones de eventos de registro |
filtrar | Filtrar | Filtrar |
amortiguación | intencionalmente | Si es un entero mayor de 0, esto hará que el apéndice bufine el evento de registro y actualice los datos de escritura cuando el búfer alcanza ese tamaño |
ConnectionSource | ConnectionSource | Debe ser recuperado la conexión de la base de datos |
nombre de table | Cadena | Requerido, inserte el nombre de la tabla de datos del evento de registro |
columnconfigs | Columnconfig [] | Debe, los campos que deben insertarse en la base de datos están compuestos de múltiples elementos <umin |
columnmappings | Columnamapping [] | Requerido, configuración de mapeo de campo |
(2) Use <DataSource> Para obtener la conexión JDBC, solo JNDI se enumera aquí:
| parámetro | tipo | describir |
|---|---|---|
| nombre | Cadena | Requerido, si el JNDI configurado es JDBC/LoggingDatabase, el valor aquí es Java: Comp/Env/JDBC/LoggingDatabase. La fuente de datos debe ser compatible con el grupo de conexión; De lo contrario, el registro será muy lento. |
(3) Use <column> para especificar qué columnas escribir en la tabla y cómo escribirlas. No tiene vulnerabilidad de inyección SQL.
| parámetro | tipo | describir |
|---|---|---|
| nombre | Cadena | Requerido, Nombre del campo de la tabla |
| patrón | Cadena | Inserte valores usando el modo PatternLayout. Nota: En el mismo elemento de columna, solo uno de los tres atributos de Patrón, Literal e IsEventTimestamp puede existir en el mismo elemento de columna. |
| literal | Cadena | Este valor se incluirá directamente en la instrucción SQL y se ejecutará, por ejemplo: la función rand () generará números aleatorios, similares a $ {} en Myibats |
| ISEVENTTIMESTAMP | booleano | Si el formato de tiempo java.sql.types.timestamp |
| isunicode | booleano | Esta propiedad se ignora a menos que se especifique un patrón. Si es verdadero, el valor se insertará en Unicode. De lo contrario, el valor se insertará en un no unicode. |
| ISCLOB | booleano | Esta propiedad se ignora a menos que se especifique un patrón. Si es verdadero, el valor se insertará en el CLOB, de lo contrario el Varchar, Nvarchar se insertará en el |
Ejemplo:
<? xml versión = "1.0" encoding = "utf-8"?> <Configuration Status = "Error"> <Appenders> <jdbc name = "databaseAppender" tableName = "dbo.application_log"> <dataSource jndiname = "java:/comp/dis/jdbc/loggingDataSource"/>> <columna namedate = "eventDate" EventDate "EventDate" isEventtimeStamp = "true" /> <column name = "nivel" patrón = "%nivel" /> <column name = "logger" patrón = "%logger" /> <columna name = "message" patrón = "%mensaje" /> <column name = "excepción" patrón = "%ex {full}" /> < /jdbc> < /appenders> <loggers> <groad nivel ref = "DatabaseAppender"/> </root> </loggers> </figuration><MatternLayout>
(1) fecha, %d/ %fecha
Patrón | Ejemplo |
|---|---|
%d {predeterminado} | 2012-11-02 14: 34: 02,781 |
%D {ISO8601} | 2012-11-02T14: 34: 02,781 |
%D {ISO8601_Basic} | 20121102T143402,781 |
%d {absoluto} | 14: 34: 02,781 |
%d {fecha} | 02 de noviembre de 2012 14: 34: 02,781 |
%d {compacto} | 20121102143402781 |
%D {HH: MM: SS, SS} | 14: 34: 02,781 |
%d {dd mmm yyy hh: mm: ss, ss} | 02 de noviembre de 2012 14: 34: 02,781 |
%D {HH: MM: SS} {GMT+0} | 18:34:02 |
%d {unix} | 1351866842 |
%d {unix_millis} | 1351866842781 |
Por supuesto, también puede personalizar el formato, como %d {yyyy-mm-dd hh: mm: ss}
(2) Logger, %C/ %Logger
Patrón de conversión | Nombre del registrador | resultado |
|---|---|---|
%C {1} | org.apache.commons.foo | Foo |
%C {2} | org.apache.commons.foo | Commons.foo |
%C {10} | org.apache.commons.foo | org.apache.commons.foo |
%C {-1} | org.apache.commons.foo | apache.commons.foo |
%C {-2} | org.apache.commons.foo | Commons.foo |
%C {-10} | org.apache.commons.foo | org.apache.commons.foo |
%C {1.} | org.apache.commons.foo | oacfoo |
%C {1.1. ~. ~} | org.apache.commons.test.foo | oa ~. ~ .foo |
%do{.} | org.apache.commons.test.foo | .... |
{?} - Cuando ? es un entero positivo, significa que N piezas se toman de la derecha, y un entero negativo significa que las partes n se eliminan de la izquierda. Entonces, por qué %C {-10} es el nombre completo, no lo sé. Bienvenido a dejar un mensaje
(3) Información de registro,%m/%msg/%mensaje
(4) Nivel de registro, %de nivel
<filtrar>
LOG4J2 viene con una variedad de filtros para uso directo, y también podemos definir los filtros nosotros mismos:
MyFilter.java
importar org.apache.logging.log4j.level; import org.apache.logging.log4j.marker; import org.apache.logging.log4j.threadcontext; import org.apache.logging.log4j.core.logevent; import org.apache.logging.log4j.core.logger; org.apache.logging.log4j.core.config.plugins.import org.apache.logging.log4j.core.config.plugins.pluginfactory; import.apache.logging.log4j.core.filter.abstractFilter; import org.apache.logging.log4j.message.message; @plugin (name = "myFilter", category = "core", elementType = "filtre", printobject = true) clase final pública myFilter extiende abstractFilter {nivel de nivel final privado; privado myFilter (nivel de nivel, resultado ondMatch, resultados onMismatch) {super (OnMatch, onMismatch); this.level = nivel; } Public Result Filter (Logger Logger, nivel de nivel, marcador de marcador, cadena msg, objeto [] params) {Filtro de retorno (nivel); } Public Result Filter (Logger Logger, nivel de nivel, marcador de marcador, msg de objeto, throwable t) {Filtro de retorno (nivel); } Filtro de resultados públicos (Logger Logger, Nivel Nivel, Marcador de marcador, Mensaje Msg, Throwable T) {Filtro de retorno (nivel); } @Override Public Result Filter (Event LogEvent) {Filtro de retorno (event.getLevel ()); } Filtro de resultados privados (nivel de nivel) { / * * Lógica de negocios * * / return Level.IsMorespeciTthan (this.level)? OnMatch: OnMismatch; } @Override public string toString () {return nivel.toString (); } @Pluginfactory public static static myFilter CreateFilter (@pluginattribute (valor = "nivel", defaultString = "Error") Nivel de nivel, @pluginattribute (valor = "onmatch", default = "neutral") resultado enmatch, @pluginattribute (value = "onmismatch", default = "deny") resultado enmismatch) {return myfilter (return myfilter (return myfilter (return myFiltter (return myFilatathTer OnMatch, OnMismatch); }}log4j2.xml
<? xml versión = "1.0" encoding = "utf-8"?> <configuración status = "warn" monitorinterval = "5" paquetes = "sus paquetes" verbose = "false" strict = "true"> <Appenderers> <console name = "console" target = "system_out" ignoreExcepciones = "true"> <matternLayout patrón = "%d {{y {y" dorol " HH: mm: ss} %nivel %logger {10} - %msg "/> <myFilter nivel =" info "onmatch =" aceptar "/> </ console> </apenders> <loggers> <root nivel =" info "> <appenderref ref =" console "/> </root> </ loggers> </figuration>Reponer:
En aplicaciones prácticas, a veces es necesario registrar la información de acceso de los usuarios, como parámetros de solicitud, ID de usuario, etc. En LOG4J1, utilizaremos MDC y NDC para almacenar la información de contexto de la aplicación, mientras que LOG4J2 usa ThreadContext para implementar las funciones de MDC y NDC.
(1) NDC utiliza un mecanismo similar a una pila para almacenar información de contexto, y los hilos son independientes.
Use %X para emitir en PatternLayout, tenga en cuenta que X es minúscula.
Ejemplo:
Test.java
ThreadContext.push ("¡Hola mundo!");log4j2.xml
<Column name = "tip" patrón = "%x" />
(2) MDC utiliza un mecanismo similar al mapa para almacenar información, y los hilos son independientes.
Use %x {userId} en PatternLayout a la salida, tenga en cuenta que X está capitalizado.
Ejemplo:
Test.java
ThreadContext.put ("UserId", "1");log4j2.xml
<Column name = "userId" patrón = "%x {userId}" />Tenga en cuenta que después de usarlo, llame a ClearAll () para borrar el mapa de contexto y la pila.
API: http://logging.apache.org/log4j/2.x/javadoc.html
Dirección oficial del sitio web: https://logging.apache.org/log4j/2.x/index.html
El código de ejemplo anterior del componente de registro del proyecto LOG4J2 es todo el contenido que comparto con usted. Espero que pueda darle una referencia y espero que pueda apoyar más a Wulin.com.