java - starter - No se puede usar marcadores de posición de propiedad de primavera en logback.xml
spring logging java config (4)
Tengo una aplicación de consola Spring Boot usando Logback. Todas las propiedades (tanto para la aplicación como para Logback) se externalizan en un archivo application.properties estándar en classpath. Estas propiedades se recogen bien en la propia aplicación, pero no se recogen en el archivo logback.xml. Parece que logback.xml se procesa antes de que se inicie Spring Boot, por lo tanto, los marcadores de posición EL no se procesan.
Usando FileNamePattern como ejemplo, en application.properties, tengo algo como esto:
log.filePattern=/%d{yyyy/MM-MMMM/dd-EEEE}
y en logback.xml, tendré esto:
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${log.logDirectory}${log.filePattern}.log
</FileNamePattern>
</rollingPolicy>
Cuando ejecute la aplicación, veré errores como:
ERROR in ch.qos.logback.core.joran.spi.Interpreter@24:25 -
RuntimeException in Action for tag [rollingPolicy]
java.lang.IllegalStateException: FileNamePattern
[log.logDirectory_IS_UNDEFINEDlog.filePattern_IS_UNDEFINED.log]
does not contain a valid DateToken
Un código similar funciona bien en otras aplicaciones de Spring (no en Spring Boot), así que tengo curiosidad si Spring Boot simplemente se comporta de forma un poco diferente.
Solución:
Gracias por la respuesta @Gary! Es bueno saber sobre la diferencia entre Spring EL y las variables de Logback ... Supuse que era Spring quien se encargaba de analizar esas variables para mí. Sí tuve el elemento, pero eso me hizo pensar.
Mi archivo application.properties estaba fuera del contenedor, por lo que Logback no tenía idea de dónde encontrarlo. Manteniendo mis propiedades relacionadas con Spring en mi archivo externo application.properties, moviendo las propiedades relacionadas con el registro a un archivo application-internal.properties (ubicado dentro del contenedor) y apuntando Logback a ese archivo ( <property resource="application-internal.properties" />
Todo funcionó como se esperaba!
Como se explicó anteriormente, puede acceder a las propiedades de arranque de primavera con el elemento <springProperty>
... pero hay que tener en cuenta que el archivo de configuración de inicio de sesión debe llamarse logback-spring.xml
, no funciona si se nombra el archivo logback.xml
(estoy usando spring-boot 1.3.5.RELEASE
)
Desde Spring Boot 1.3 tiene una mejor manera de obtener propiedades de resorte en su configuración de logback-spring.xml:
Ahora puede agregar un elemento "springProperty".
<springProperty name="destination" source="my.loggger.extradest"/>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>${destination}</file>
...
</file>
</appender>
https://github.com/spring-projects/spring-boot/commit/055ace37f006120b0006956b03c7f358d5f3729f
editar: gracias a Anders
.........
Las soluciones anteriores funcionan principalmente para bootrap.properties
. Sin embargo, la única forma de utilizar las propiedades del servidor de configuración de Spring remoto en la configuración de logback que he encontrado actualmente, es aplicarlas programáticamente:
@Component
public class LoggerConfiguration implements ApplicationListener<EnvironmentChangeEvent> {
@Autowired protected Environment environment;
@Override
public void onApplicationEvent(EnvironmentChangeEvent event) {
// enviroment here has already loaded all properties and you may alter logback config programatically
ch.qos.logback.classic.Logger rootLogger = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
}
}
Here hay un buen ejemplo de cómo personalizar el logback con el nuevo appender de esta manera.
${...}
no es "Spring EL" en Spring; son marcadores de posición de propiedad.
Creo que está confundiendo las "variables" de logback con Spring "Property Placeholders".
Simplemente usan la misma sintaxis ${...}
.
logback no sabe nada sobre el mecanismo de marcador de posición de la propiedad Spring y viceversa. Necesita configurar sus variables de logback de acuerdo con la documentación de logback y no en application.properties
/ application.yml
que es estrictamente un concepto de Spring (arranque).
EDITAR:
Después de echar un vistazo rápido a los documentos de registro, agregando
<property resource="application.properties" />
al logback.xml
debería funcionar.