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.
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);
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);
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);
}
Ci-dessous a fonctionné pour moi, Log4j2 avec SLF4J wrapper:
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(...)
}
}
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:
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.
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");
Soyez conscient et n'utilisez pas les deux en même temps.