web-dev-qa-db-fra.com

Charger le fichier de configuration Log4j2 par programme

Je souhaite charger le fichier de configuration XML Log4j2 par programme à partir de mon application.

J'ai essayé ceci:

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

et ça:

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

Mais rien ne fonctionne encore.

28
HashimR

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

ConfigurationSource source = new ConfigurationSource();
source.setLocation(logConfigurationFile);
source.setFile(new File(logConfigurationFile));
source.setInputStream(new FileInputStream(logConfigurationFile));
Configurator.initialize(null, source);
12
HashimR

Pour la dernière version 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);
34
switch_java3

Si vous avez un seul point d'entrée principal, cet extrait de code peut vous éviter des problèmes. L'appel de la propriété set doit être déclenché avant la création des enregistreurs. Cette approche fonctionne avec des fichiers sur le classpath.

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

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

}
16
dcompiled

Ci-dessous a fonctionné 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 de toURI() pour suivre Format du schéma d'URI de fichier , sinon, il renvoie MalformedURLException.

Sources:

3
silver

Si vous utilisez une application Web Servlet 3.0, vous pouvez utiliser Log4jServletContextListener et procédez comme suit:

Ecrivez une LogContextListener personnalisée qui va de Log4jServletContextListener, configurez-la dans votre web.xml et désactivez l'initialisation automatique:

<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 personnalisation LogContextListener, écrasez contextInitialized et définissez l'emplacement de 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 quevous pouvez calculer le chemin en fonction de certaines informations supplémentaires et accéder à log4j2.xml même s'il se trouve en dehors de votre chemin de classe.

2
lanoxx
final URL log4j = Resources.getResource("log4j2-test.xml");
LoggerContext.getContext(false)
  .start(new XmlConfiguration(new ConfigurationSource(
    Resources.asByteSource(log4j).openStream(),
    log4j)));
0
TJR

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");

Soyez conscient et n'utilisez pas les deux en même temps.

0
myset