2014-01-13 15 views
19

Ich möchte Log4j2 XML-Konfigurationsdatei programmgesteuert von meiner Anwendung laden.Laden Log4j2 Konfigurationsdatei programmgesteuert

dies versucht:

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

und diese:

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

Aber nichts funktioniert noch.

+0

mit allen rückwärts inkompatible Änderungen an der Konfiguration eingeführt in log4j2 Nachladen es wäre sinnvoll, angeben, welche Version des log4j2 api und Kern Sie verwenden ... –

Antwort

10

Die Antwort 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); 
+0

Ich versuche, das gleiche zu tun, aber Ich versage sogar mit dem obigen Code. Hattest du die log4j2-Webabhängigkeit in deinem Projekt? Meine log4j2.xml befindet sich außerhalb des Klassenpfads und ich versuche, sie in einer Spring-Bean mit einer @ PostConstruct-Methode zu laden. – ColinMc

+0

Meine Protokoll-XML-Konfigurationsdatei befand sich außerhalb des Klassenpfads. – HashimR

+0

War Ihre Anwendung eine Web-App? Ich sollte erwähnen, dass ich auch slf4j verwende, um log4j2 zu abstrahieren. – ColinMc

11

Wenn Sie einen einzigen Haupteinstieg haben, kann Ihnen dieses Code-Snippet einige Probleme ersparen. Der Aufruf der Eigenschaft set 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); 

} 
+0

Das hat ausgezeichnet funktioniert, ich habe versucht, die Eigenschaft auf Constructor zu setzen, aber es hat nicht funktioniert. Statischer Block gelöst. – another

22

Für die neueste Version von log4j, ist hier, was ein externes log4j2.xml zum Laden funktionieren sollte:

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

Sie sollten einfach 'Configurator.initialize (null," fileName ") verwenden können;' –

+1

Ja @Conor das ist richtig. Vielen Dank! –

1

Wenn Sie mit einer Servlet 3.0 Web Application Sie die Log4jServletContextListener verwenden können und tun Sie folgendes:

Schreiben Sie eine benutzerdefinierte LogContextListener, die von Log4jServletContextListener erstreckt, richten Sie es in dir r web.xml 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 Ihrer benutzerdefinierten LogContextListenercontextInitialized überschreiben und stellen Sie die Konfigurations Lage

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 den Standort direkt in der web.xml Konfiguration ist, dass Sie den Pfad berechnen kann basierend auf einigen zusätzlichen Informationen und Zugriff auf die log4j2.xml, auch wenn es außerhalb Ihres Klassenpfads ist.

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

Nur ein Hinweis für diese - vorsichtig sein mit "log4j2-test.xml" zum Testen der Dinge. Wenn dies in einem der Ordner ist, die log4j2 überprüft, wird es über "log4j2.xml" verwendet und Sie denken, dass das Überschreiben von diesem funktioniert hat, obwohl es das nicht getan hat. Ich habe Ihren Code nicht ausprobiert, aber ich hatte dieses Problem mit einem früheren Code-Snippet. Ich habe "log4j2-test.xml" verwendet und dachte, dass alles zur Laufzeit überschrieben wird, nur um festzustellen, dass es überschrieben wurde, weil log4j2 zuerst nach "log4j2-test.xml" und dann nach "log4j2.xml" https: // logging sucht. apache.org/log4j/2.0/manual/configuration.html#AutomaticConfiguration – adpro

Verwandte Themen