wake-up-neo.net

Log4j2-Konfigurationsdatei programmgesteuert laden

Ich möchte die Log4j2-XML-Konfigurationsdatei programmgesteuert aus meiner Anwendung laden.

Versuchte das:

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

und das:

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

Aber es geht noch nichts.

28
HashimR

Ich habe die Antwort selbst gefunden. Jemand könnte es nützlich finden.

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

Für die neueste Version von log4j sollte Folgendes funktionieren, um einen externen log4j2.xml zu laden:

String log4jConfigFile = System.getProperty("user.dir") + File.separator + "log4j2.xml";
ConfigurationSource source = new ConfigurationSource(new FileInputStream(log4jConfigFile));
Configurator.initialize(null, source);
34
switch_java3

Wenn Sie einen einzigen Haupteinstiegspunkt haben, kann Ihnen dieses Code-Snippet einige Probleme ersparen. Der gesetzte Eigenschaftsaufruf muss ausgelöst werden, bevor Logger erstellt werden. Dieser Ansatz funktioniert mit Dateien im Klassenpfad.

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

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

}
16
dcompiled

Unten arbeitete für mich Log4j2 mit SLF4J Wrapper:

Lösung 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(...)
    }

}

Lösung 2:

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

Sie müssen toURI() folgen, um das File URI Scheme-Format zu verwenden , andernfalls wird MalformedURLException ausgelöst.

Quellen:

3
silver

Wenn Sie eine Servlet 3.0-Webanwendung verwenden, können Sie den Log4jServletContextListener verwenden und Folgendes tun:

Schreiben Sie eine benutzerdefinierte LogContextListener, die sich von Log4jServletContextListener erstreckt, legen Sie sie in Ihrem web.xml fest und deaktivieren Sie die automatische Initialisierung:

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

In Ihrem benutzerdefinierten LogContextListener überschreiben Sie contextInitialized und legen Sie den Konfigurationsort fest

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

Der Vorteil gegenüber der direkten Konfiguration des Speicherorts in web.xml besteht darin, dass Sie den Pfad anhand einiger zusätzlicher Informationen berechnen und auf die Datei log4j2.xml zugreifen können, auch wenn sie außerhalb Ihres Klassenpfads liegt.

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

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

Seien Sie sich bewusst und verwenden Sie nicht beide gleichzeitig.

0
myset