starter logger log java spring spring-boot logging logback

java - logger - Spring Boot, Logback y Logging.config propiedad



spring logging java config (6)

Estoy implementando el registro en un proyecto de arranque de primavera con la biblioteca logback. Quiero cargar diferentes archivos de configuración de registro de acuerdo con mis perfiles de primavera (propiedad ''spring.pofiles.active''). Tengo 3 archivos: logback-dev.xml, logback-inte.xml y logback-prod.xml. Estoy usando Spring Boot versión 1.2.2.RELEASE.

Como puede leer en la documentación de arranque de primavera ( here ). Dice:

Los diversos sistemas de registro pueden activarse mediante la inclusión de las bibliotecas apropiadas en el classpath, y personalizarse aún más proporcionando un archivo de configuración adecuado en la raíz del classpath, o en una ubicación especificada por la propiedad Spring Environment logging.config . (Sin embargo, tenga en cuenta que, dado que el registro se inicializa antes de crear ApplicationContext, no es posible controlar el registro desde @PropertySources en los archivos Spring @Configuration. Las propiedades del sistema y los archivos de configuración externos de Spring Boot convencionales funcionan bien).

Así que intenté establecer la propiedad ''logging.config'' en mi archivo application.properties:

logging.config=classpath:/logback-${spring.profiles.active}.xml

Pero cuando inicio mi aplicación, mi logback- {profile} .xml no se carga ...

Creo que el registro es un problema común que todos los proyectos que utilizan el arranque de primavera han encontrado. ¿Estoy en el camino correcto con el enfoque anterior? Tengo otras soluciones que funcionan, pero las encuentro no tan elegantes (análisis condicional con Janino en el archivo logback.xml o la propiedad de línea de comandos).


El procesamiento condicional con logback será una solución sin muchos archivos de logback. Aquí hay un enlace y una configuración de inicio de sesión de muestra con perfiles de resorte.

<configuration> <property name="LOG_LEVEL" value="INFO"/> <if condition=''"product".equals("${spring.profiles.active}")''> <then> <property name="LOG_LEVEL" value="INFO"/> </then> <else> <property name="LOG_LEVEL" value="ERROR"/> </else> </if> . . appender, logger tags etc. . . <root level="${LOG_LEVEL}"> <appender-ref ref="STDOUT"/> </root> </configuration>

Además, es posible que deba agregar esto a su pom.xml

<dependency> <groupId>org.codehaus.janino</groupId> <artifactId>janino</artifactId> <version>3.0.6</version> </dependency>


En lugar de agregar xmls de inicio de sesión por separado para cada perfil o tener la condición IF, sugeriría lo siguiente (si tiene menos diferencia en los xmls '') para un procesamiento condicional fácil:

<springProfile name="dev"> <logger name="org.sample" level="DEBUG" /> </springProfile> <springProfile name="prod"> <logger name="org.sample" level="TRACE" /> </springProfile>


Encontré una solución y entendí por qué spring no usa mi propiedad ''logging.config'' definida en el archivo application.properties .

Solución y explicación:

Al inicializar el registro, Spring Boot solo se ve en classpath o variables de entorno .

La solución que utilicé fue incluir un archivo logback.xml primario que incluía el archivo de configuración de registro correcto de acuerdo con el perfil de Spring.

logback.xml:

<configuration> <include resource="logback-${spring.profiles.active}.xml"/> </configuration>

logback- [perfil] .xml (en este caso, logback-dev.xml):

<included> <!-- put your appenders --> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <!-- encoders are assigned the type ch.qos.logback.classic.encoder.PatternLayoutEncoder by default --> <encoder> <pattern>%d{ISO8601} %p %t %c{0}.%M - %m%n</pattern> <charset>utf8</charset> </encoder> </appender> <!-- put your loggers here --> <logger name="org.springframework.web" additivity="false" level="INFO"> <appender-ref ref="CONSOLE" /> </logger> <!-- put your root here --> <root level="warn"> <appender-ref ref="CONSOLE" /> </root> </included>

Nota: ''spring.profiles.active'' debe establecerse en los argumentos de la línea de comandos al iniciar la aplicación. EG para propiedades JVM: -Dspring.profiles.active=dev

Documentos de referencia:

Editar (múltiples perfiles activos) : para evitar múltiples archivos, podríamos utilizar el procesamiento condicional que requiere la dependencia de Janino ( configuración aquí ), consulte la documentación condicional . Con este método, también podemos verificar múltiples perfiles activos al mismo tiempo. EG (no probé esta solución, así que por favor comente si no funciona):

<configuration> <if condition=''"${spring.profiles.active}".contains("profile1")''> <then> <!-- do whatever you want for profile1 --> </then> </if> <if condition=''"${spring.profiles.active}".contains("profile2")''> <then> <!-- do whatever you want for profile2 --> </then> </if> <!-- common config --> </configuration>

Ver respuesta javasenior para otro ejemplo de un procesamiento condicional.


Otro enfoque que podría manejar múltiples perfiles es crear un archivo de propiedades separado para cada entorno.

application-prod.properties

logging.config=classpath:logback-prod.xml

application-dev.properties

logging.config=classpath:logback-dev.xml

application-local.properties

logging.config=classpath:logback-local.xml

Ten cuidado

Si no tiene cuidado, podría terminar iniciando sesión en algún lugar inesperado

-Dspring.profiles.active=local,dev //will use logback-dev.xml -Dspring.profiles.active=dev,local //will use logback-local.xml


Puede especificar diferentes logback.xml para diferentes perfiles, solo 3 pasos:

1, especifique el perfil activo en application.properties o application.yml :

spring.profiles.active: test

2, Logback de configuración para incluir diferentes configuraciones por perfil:

<!DOCTYPE configuration> <configuration scan="true" scanPeriod="30 seconds"> <springProperty scope="context" name="profile" source="spring.profiles.active"/> <include resource="logback.${profile}.xml"/> </configuration>

3, Crear archivo de configuración logback.test.xml :

<?xml version="1.0" encoding="UTF-8"?> <included> <include resource="org/springframework/boot/logging/logback/base.xml"/> <root level="INFO"/> </included>

Es muy simple, no necesitas hacer nada más.


Spring tiene soporte para la siguiente etiqueta <springProperty/> dentro del archivo XML Logback, esta etiqueta se describe here . Significa que puede agregar fácilmente variables desde el archivo de propiedades Spring, incluso este valor variable se resuelve desde la variable de entorno / sistema por Spring.