Charger le fichier de configuration Log4j2 par programmation

je veux charger le fichier de configuration XML Log4j2 par programmation À partir de mon application.

essayé:

ConfigurationSource source = new ConfigurationSource();
source.setLocation(logConfigurationFile);
Configurator.initialize(null, source);

et ceci:

ConfigurationSource source = new ConfigurationSource();
source.setLocation(logConfigurationFile);
ConfigurationFactory factory = (ConfigurationFactory) XMLConfigurationFactory.getInstance().getConfiguration(source);
ConfigurationFactory.setConfigurationFactory(factory);

Mais rien ne fonctionne encore.

26
demandé sur HashimR 2014-01-13 08:21:43

7 réponses

pour la version la plus récente de log4j, voici ce qui devrait fonctionner pour charger un log4j2.xml externe:

String log4jConfigFile = System.getProperty("user.dir") + File.separator + "log4j2.xml";
ConfigurationSource source = new ConfigurationSource(new FileInputStream(log4jConfigFile));
Configurator.initialize(null, source);
29
répondu switch_java3 2015-02-26 22:27:48

si vous n'avez qu'un seul point d'entrée principal, cet extrait de code pourrait vous éviter quelques problèmes. L'appel de propriété set doit être activé avant la création des loggers. Cette approche fonctionne avec les fichiers sur classpath.

public class TestProcess {
    static {
        System.setProperty("log4j.configurationFile", "log4j-alternate.xml");
    }

    private static final Logger log = LoggerFactory.getLogger(TestProcess.class);

}
13
répondu dcompiled 2014-09-17 03:01:29

a trouvé la réponse moi-même. Quelqu'un pourrait trouver utile.

ConfigurationSource source = new ConfigurationSource();
source.setLocation(logConfigurationFile);
source.setFile(new File(logConfigurationFile));
source.setInputStream(new FileInputStream(logConfigurationFile));
Configurator.initialize(null, source);
12
répondu HashimR 2014-01-13 09:37:01

si vous utilisez un Servlet 3.0 Web Application vous pouvez utiliser le Log4jservlettextlistener et faire ce qui suit:

Écrire une coutume LogContextListener qui s'étend de Log4jServletContextListener , mis en place dans votre web.xml et désactiver l'auto initialisation:

<listener>
    <listener-class>com.example.LogContextListener</listener-class>
</listener>
<context-param>
    <param-name>isLog4jAutoInitializationDisabled</param-name>
    <param-value>true</param-value>
</context-param>

dans votre custom LogContextListener overwrite contextInitialized et définissez l'emplacement de la configuration

public void contextInitialized(ServletContextEvent event) { 
    /* Some logic to calculate where the config file is saved. For 
     * example you can read an environment variable.
     */
    String pathToConfigFile = ... + "/log4j2.xml";
    Configurator.initialize(null, pathToConfigFile);
    super.contextInitialized(event);
}

l'avantage par rapport à la configuration de l'emplacement directement dans le web.xml est que vous pouvez calculer le chemin sur la base de quelques informations supplémentaires et accéder au log4j2.xml même si l'extérieur de votre classpath.

2
répondu lanoxx 2015-05-01 21:09:51

ci-dessous travaillé pour moi, Log4j2 avec SLF4J wrapper:

Solution 1:

public class MyClass {

    static {
        try {
            InputStream inputStream = new FileInputStream("C:/path/to/log4j2.xml");
            ConfigurationSource source = new ConfigurationSource(inputStream);
            Configurator.initialize(null, source);
        } catch (Exception ex) {
            // Handle here
        }
    }

    private static final Logger LOGGER = LoggerFactory.getLogger(MyClass.class); // LogManager if not using SLF4J

    public void doSomething() {
        LOGGER.info(...)
    }

}

Solution 2:

static {
    File log4j2File = new File("C:/path/to/log4j2.xml");
    System.setProperty("log4j2.configurationFile", log4j2File.toURI().toString());
}

Besoin toURI() à suivre Fichier de Schéma d'URI format , sinon il jette MalformedURLException .

Sources:

2
répondu silver 2018-07-08 07:32:09
final URL log4j = Resources.getResource("log4j2-test.xml");
LoggerContext.getContext(false)
  .start(new XmlConfiguration(new ConfigurationSource(
    Resources.asByteSource(log4j).openStream(),
    log4j)));
0
répondu TJR 2017-03-01 06:09:47

considérant - https://logging.apache.org/log4j/2.x/log4j-core/apidocs/org/apache/logging/log4j/core/config/Configurator.html

Configurator.initialize(null, "classpath:conf/logger.xml");
or
Configurator.initialize(null, "/full_path/conf/logger.xml");

être conscient et ne pas utiliser les deux en même temps.

0
répondu myset 2018-03-17 09:43:56