spring groovy environment-variables logback spring-boot

¿Cómo obtener las propiedades del entorno de application.properties en logback.groovy en el proyecto Spring Boot?



logback xml vs logback spring xml (2)

logback.groovy necesita ser evaluado muy temprano porque, de lo contrario, el código para cargar la configuración del resorte, crear instancias de beans, etc. no podría registrar nada. Es por eso que @Inject no puede funcionar.

Veo 2 opciones:

  1. Puede cargar fácilmente application.properties en logback.groovy, pero está lejos de ser trivial tomar todos los mecanismos de anulación de configuración que la primavera proporciona en la cuenta
  2. Cree un bean de primavera que modifique la configuración de logback programáticamente cuando se inicialice

Un enfoque diferente es externalizar la configuración de logback en producción con -Dlogback.configurationFile = / path / to / config.groovy . Poner el archivo de configuración en una ubicación conocida (como / etc / my-app ) facilita el cambio de niveles de registro en la producción sin volver a implementar (o incluso reiniciar).

Intentando inyectar las propiedades definidas en application.properties/application.yml en la logback.groovy comandos logback.groovy en el proyecto Spring Boot .

No puedo Inject Environment o ApplicationContext en guiones maravillosos.

¿Hay alguna solución?

No estoy buscando soluciones como System.getProperty(''spring.profiles.active'')

src / main / resources / logback.groovy

import org.springframework.core.env.Environment @Inject private Environment env; //this is not working. how to get env here? println "spring.profiles.active : ${env.getProperty(''spring.profiles.active'')}" appender("STDOUT", ConsoleAppender) { encoder(PatternLayoutEncoder) { pattern = "%green(%d{HH:mm:ss.SSS}) [%thread] %highlight(%-5level) %cyan(%logger{36}) - %msg%n" } } if(System.getProperty("spring.profiles.active")?.equalsIgnoreCase("prod")) { root INFO, ["STDOUT", "FILE"] } else { root INFO, ["STDOUT"] }

src / main / resources / application.yml

--- spring: profiles: active: development


Perdón por resucitar este hilo, pero ya que esto es lo que encontré mientras buscaba una solución, quería compartir una solución alternativa.

He utilizado un convertidor personalizado y una regla de conversión para extraer propiedades en el recurso classpath (es decir, application.properties):

En logback.groovy:

conversionRule(''springApplicationName'', CustomSpringApplicationNameConverter) def patternExpression = ''%green([%d{YYYY-MM-dd HH:mm:ss.SSS}]) [%t] %highlight(%-5level) %magenta([%springApplicationName]) - %cyan(%logger{36}) -- %msg%n''

y luego ''patternExpression'' utilizado en el appender deseado

y mi clase de convertidor personalizado (en groovy):

class CustomSpringApplicationNameConverter extends ClassicConverter { @Override String convert(ILoggingEvent event) { ClassPathResource classPathResource = new ClassPathResource(''application.properties'') Properties applicationProperties = new Properties() applicationProperties.load(classPathResource.inputStream) String springApplicationName = applicationProperties.getProperty(''spring.application.name'') if (!springApplicationName) { System.err.println(''Could not find entry for /'spring.application.name/' in /'application.properties/''') } springApplicationName } }