web-dev-qa-db-fra.com

Impossible d'utiliser les espaces réservés de propriété Spring dans logback.xml

J'ai une application console Spring Boot utilisant Logback. Toutes les propriétés (pour l'application ainsi que pour Logback) sont externalisées dans un fichier application.properties standard dans le chemin de classe. Ces propriétés sont très bien récupérées dans l'application elle-même, mais ne sont pas récupérées dans le fichier logback.xml. Il semble que le fichier logback.xml soit traité avant le démarrage de Spring Boot, par conséquent les espaces réservés EL ne sont pas traités.

En utilisant FileNamePattern comme exemple, dans le fichier application.properties, j'ai quelque chose comme ceci:

log.filePattern=/%d{yyyy/MM-MMMM/dd-EEEE}

et dans logback.xml, je vais avoir ceci:

<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    <FileNamePattern>${log.logDirectory}${log.filePattern}.log
    </FileNamePattern>
</rollingPolicy>

Lors de l'exécution de l'application, des erreurs telles que:

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 code similaire fonctionne très bien dans d'autres applications Spring (pas Spring Boot), donc je suis curieux de savoir si Spring Boot se comporte juste un peu différemment.

Solution:

Merci pour la réponse @Gary! Bon à savoir sur la différence entre Spring EL et les variables de Logback ... J'avais supposé que c'était Spring qui était en charge d'analyser ces variables pour moi. J'ai ai eu l'élément, mais cela m'a fait réfléchir.

Mon fichier application.properties était en dehors du pot, donc Logback ne savait pas où le trouver. En conservant mes propriétés liées à Spring dans mon fichier externe application.properties, en déplaçant les propriétés liées à la journalisation dans un fichier application-internal.properties (situé à l'intérieur le bocal) et en pointant Logback vers que fichier (<property resource="application-internal.properties" />) tout a fonctionné comme prévu!

34
brmc72

${...} n'est pas "Spring EL" au printemps; ce sont des espaces réservés de propriété.

Je pense que vous confondez les "variables" de déconnexion avec les "espaces réservés de propriété" de Spring.

Ils utilisent simplement la même syntaxe ${...}.

logback ne sait rien du mécanisme d'espace réservé de la propriété Spring et vice-versa. Vous devez configurer vos variables de déconnexion conformément à la documentation de déconnexion et non dans application.properties/application.yml qui est strictement un concept Spring (boot).

MODIFIER:

Après un bref aperçu des documents de déconnexion, en ajoutant

<property resource="application.properties" />

au logback.xml devrait marcher.

35
Gary Russell

Depuis Spring Boot 1.3, vous disposez d'un meilleur moyen d'obtenir des propriétés de ressort dans votre configuration logback-spring.xml:

Maintenant, vous pouvez simplement ajouter un élément "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

edit: merci à Anders

.........

53
Lasse L

Comme indiqué ci-dessus, vous pouvez accéder aux propriétés de démarrage à ressort en utilisant le <springProperty> élément ... mais une chose à garder à l'esprit est que le fichier de configuration de la déconnexion doit être nommé logback-spring.xml, cela ne fonctionne pas si vous nommez le fichier logback.xml (J'utilise spring-boot 1.3.5.RELEASE)

8
anders

Les solutions ci-dessus fonctionnent principalement pour bootrap.properties. Cependant, la seule façon d'utiliser les propriétés du serveur Spring Config Server distant dans la configuration de la déconnexion que j'ai trouvée actuellement est de les appliquer par programme:

@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);
    }


}

Ici est un bon exemple de personnalisation de la déconnexion avec le nouvel appender de cette façon.

1
Lukasz Frankowski