3
votes

Comment spécifier logging.config lorsque plusieurs applications Spring Boot sont déployées sur Tomcat

J'ai plusieurs applications Spring Boot (X, Y, Z) packagées en tant que fichiers war déployés sur mon tomcat. Je souhaite utiliser log4j2 comme système de journalisation pour mes applications. Donc, pour changer le système de journalisation de disons X, dans tomcat, je règle la valeur 'logging.config' de Sping Boot Propery pour qu'elle pointe vers /tomcat/apps/X/WEB-INF/classes/log4j2-spring.properties. En faisant cette journalisation fonctionne très bien pour X.

Flashback: Si nous spécifions logging.config = classpath: log4j2.properties dans application.properties, la journalisation fonctionne lorsque nous exécutons Exécuter en tant qu'application Java dans Eclipse. Mais, la journalisation ne fonctionne pas lorsque nous le déployons en tant que fichier WAR sur tomcat. Pour le faire fonctionner, j'ai dû mettre logging.config = {Path-to-myapp} /log4j2.properties dans tomcat / bin / setenv.bat.

Ma question est: si j'ai plusieurs applications, comment puis-je définir logging.config pour chaque application Spring Boot?

La journalisation étant initialisée avant la création de ApplicationContext, il n'est pas possible de contrôler la journalisation depuis @PropertySources au printemps @ Fichiers de configuration. La seule façon de changer le système de journalisation ou le désactiver entièrement se fait via les propriétés système.


0 commentaires

4 Réponses :


1
votes

Vous pouvez définir un chemin de journalisation personnalisé pour chaque application, quelque chose comme ceci:

logging:
  level:
    root: INFO
    org.apache.http: ERROR
  file: ${catalina.base:.}/logs/app-${app-number}.log
  pattern:
    file: ${logPattern}
    console: ${logPattern}


0 commentaires

4
votes

Je pense qu'il y a un bug. Le comportement de log4j2.properties/log4j2-spring.properties et log4j2-spring.xml n'est pas le même. Si nous utilisons log4j2.properties, alors logging.config = classpath: log4j2.properties doit être spécifié. D'un autre côté, si nous utilisons log4j2-spring.xml , il n'est pas nécessaire de spécifier logging.config .

À mon avis, il s'agit d'un bogue important qui doit être corrigé pour permettre à plusieurs applications Spring Boot de se déployer sur le même serveur.

Une correction doit être apportée pour prendre en charge log4j2.properties dans org.springframework.boot.logging.log4j2.Log4J2LoggingSystem.getCurrentlySupportedConfigLocations()


0 commentaires

0
votes

J'ai eu un problème similaire, dans ce cas j'ai apporté les modifications suivantes:

  • Externaliser le fichier log4j2.properties des applications comme vous l'avez fait, mentionné l'emplacement externe du fichier dans le fichier .env (dans votre cas, c'est dans le fichier .bat de tomcat). Chaque démarrage à ressort renvoie uniquement à ce fichier.
  • Dans ce fichier log4j2.properties, nous avons créé un appender et un logger séparés pour chaque service et nous le configurons.

Ce n'est pas une solution exacte mais jusqu'à certains points, cela fonctionne.

Pour chaque service, si vous voulez le faire, cela signifie que vous devez créer chaque fichier et emplacement et tout ... et ce n'est pas gérable après un certain point.

Comme mentionné dans le commentaire précédent, il faut un mécanisme pour gérer ce genre de situation de manière méthodique et structurelle.


0 commentaires

2
votes

J'ai renommé application.properties et défini la configuration log4j en apportant les modifications suivantes:

public class MyApplication extends SpringBootServletInitializer {

public static void main(String[] args) {
    new SpringApplicationBuilder(MyApplication.class)
    .properties("spring.config.name:new-app-properties-name")
    .build()
    .run(args);
}

@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
    return application.sources(MyApplication.class).properties("spring.config.name: new-app-properties-name");
}

/**
 * Set log4j2.xml location
 */
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
    servletContext.setInitParameter("logging.config", "/my-app/config/log4j2.xml");
    super.onStartup(servletContext);
}
}


0 commentaires