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.
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);
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);
}
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);
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.
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:
- format approprié pour log4j2.XML RollingFile configuration
- https://github.com/jprante/elasticsearch-jdbc/issues/562
- https://www.codeproject.com/Questions/190269/MalformedURLException-unknown-protocol-c-How-to-ha
- https://coderanch.com/t/633544/open-source/java-net-MalformedURLException-initialize-log
final URL log4j = Resources.getResource("log4j2-test.xml");
LoggerContext.getContext(false)
.start(new XmlConfiguration(new ConfigurationSource(
Resources.asByteSource(log4j).openStream(),
log4j)));
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.