Hola queridos Khabrovites.
El material presentado en el artículo está destinado a principiantes y, probablemente, me ahorrará varias horas de búsqueda en StackOverFlow y otros sitios para obtener un sistema de registro conveniente, que a su vez entenderá dónde iniciar sesión: en la consola, el archivo o el logstash.
Al comienzo del proyecto, la tarea siempre surge de configurar correctamente el registro, mientras que en el entorno local los registros deben mostrarse en la consola y en el archivo para mayor comodidad durante la depuración, y es extremadamente indeseable enviar los registros a la consola en el servidor remoto, pero en su lugar deben escribirse en el archivo, logstash o en la base de datos. Y si tiene Windows localmente y en una máquina Linux remota, la dirección de ubicación de este archivo de registro es diferente.
Por lo tanto, hay muchas situaciones en las que necesita corregir constantemente la configuración del sistema de registro con las manos, dependiendo de las circunstancias externas.
Estaba cansado de recordar y comentar constantemente los apéndices, y desarrollé una forma de configurar Log4j2 para que, dependiendo del perfil Maven seleccionado, solo los apéndices correctos se enciendan automáticamente.
A continuación hay una instrucción para configurar un proyecto usando Spring Boot + Maven + Log4j2, cuyo resultado será un sistema de registro configurado y dos apéndices: CONSOLE y SOCKET.
En primer lugar, realizaremos cambios en la configuración de Maven (pom.xml):
En variables en todo el nivel pom.xml, agregue la dirección de host para logstash-appender:
<properties> <logstash.host>logstashcsm.example.ru</logstash.host> </properties>
Agregue las dependencias necesarias para el trabajo:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency> </dependencies>
Tenga en cuenta que excluimos la dependencia spring-boot-starter-logging de spring-boot-starter-web.
Configure los perfiles de Maven para administrar dinámicamente los apéndices conectados. En el nivel de cada perfil, establecemos las variables logstash.port, logger.console.tresholdFilter, logger.socket.tresholdFilter
.
<profiles> <profile> <id>local</id> <properties> <logstash.port>10000</logstash.port> <logger.console.tresholdFilter>ALL</logger.console.tresholdFilter> <logger.socket.tresholdFilter>OFF</logger.socket.tresholdFilter> </properties> </profile> <profile> <id>dev</id> <properties> <logstash.port>10001</logstash.port> <logger.console.tresholdFilter>OFF</logger.console.tresholdFilter> <logger.socket.tresholdFilter>ALL</logger.socket.tresholdFilter> </properties> </profile> </profiles>
logstash.port : el puerto al que se deben enviar los registros.
logger.console.tresholdFilter : el valor establece el nivel de filtrado de los registros que se muestran en la consola. En nuestro caso, TODO significa que los registros de todos los niveles se mostrarán en el apéndice de la consola.
logger.socket.tresholdFilter : el valor establece el nivel de filtrado de los registros que se envían a logstash. APAGADO: significa que no se pasarán los registros enviados a este apéndice.
Ahora necesitamos hacer cambios en application.properties para que desde el archivo Log4j2.xml podamos acceder al valor de las variables especificadas en pom.xml:
logstash.host=@logstash.host@
logstash.port=@logstash.port@
logger.console.tresholdFilter=@logger.console.tresholdFilter@
logger.socket.tresholdFilter=@logger.socket.tresholdFilter@
Y finalmente, configuramos la configuración de Log4j2 en el archivo log4j2.xml:
<?xml version="1.0" encoding="UTF-8"?> <Configuration> <Properties> <Property name="socket.host">${bundle:application:logstash.host}</Property> <Property name="socket.port">${bundle:application:logstash.port}</Property> <Property name="console.thresholdFilter">${bundle:application:logger.console.tresholdFilter}</Property> <Property name="socket.thresholdFilter">${bundle:application:logger.socket.tresholdFilter}</Property> </Properties> <Appenders> <Console name="CONSOLE" target="SYSTEM_OUT"> <ThresholdFilter level="${console.thresholdFilter}"/> <PatternLayout pattern="%d %-5p [%t] %c{10} - %m%n"/> </Console> <Socket name="SOCKET" host="${socket.host}" port="${socket.port}" immediateFlush="true"> <ThresholdFilter level="${socket.thresholdFilter}"/> <JSONLayout eventEol="true" compact="true"/> </Socket> <Async name="ASYNC"> <AppenderRef ref="CONSOLE"/> <AppenderRef ref="SOCKET"/> </Async> </Appenders> <Loggers> <Logger name="ru.example" level="debug" additivity="false"> <AppenderRef ref="ASYNC"/> </Logger> <Root level="error"> <AppenderRef ref="ASYNC"/> </Root> </Loggers> </Configuration>
Ahora, para llamar al registrador en su clase, debe crear una instancia del mismo:
private static Logger logger = LoggerFactory.getLogger(YourClass.class);
y voltearte hacia él:
logger.info(" ");
Eso es todo Ahora el inicio de sesión funcionará teniendo en cuenta el perfil de Maven que está activo en el proyecto.
Tenga en cuenta que en la lista del archivo log4j2.xml
, se ru.example
dos registradores: ru.example
y root
, y tienen diferentes niveles de registro de eventos. El primero funcionará en todos los eventos generados por las clases desde el ru.example.*
Empaquete y ru.example.*
todo desde el nivel DEBUG, y el registrador root
registrará eventos desde absolutamente todas las clases, pero desde el nivel ERROR.
Al mismo tiempo, para que las entradas no se dupliquen en los registros, se usa la configuración additivity="false"
.