2013-07-07 14 views

Antwort

4

sieht aus wie ich den Weg gefunden habe:

File configFile = new File("c:\\my_path\\log4j2.xml"); 
LoggerContext loggerContext = Configurator.initialize("my_config", null, configFile.toURI()); 
Configuration configuration = loggerContext.getConfiguration(); 
Collection<LoggerConfig> loggerConfigs = configuration.getLoggers().values(); 
2

Wenn Sie in einer Web-Anwendung ausführen, können Sie mehr LoggerContext s haben. Bitte beachten Sie, wie LoggerConfig s über JMX in der org.apache.logging.log4j.core.jmx.Server Klasse ausgesetzt sind.

+0

10x. werde es überprüfen. – YuriR

2

erhalten alle Logger in log4j2 verwendet:

LoggerContext logContext = (LoggerContext) LogManager 
       .getContext(false); 
Map<String, LoggerConfig> map = logContext.getConfiguration() 
       .getLoggers(); 

Achtung:

Verwendung org.apache.logging.log4j.core.LoggerContext

nicht org.apache.logging.log4j.spi .LoggerContext

+0

Es funktioniert wie ein Charme. – zygimantus

+0

Mit 2.6.2 gibt es keine 'LoggerContext.getConfiguration()' –

+0

Verwenden Sie wie org.apache.logging.log4j.core.LoggerContext logContext = (org.apache.logging.log4j.core.LoggerContext) LogManager .getContext (falsch); – zhukunqian

2

YuriRs Antwort ist unvollständig, da es nicht darauf hinweist, dass LoggerConfig Objekte zurückgegeben werden, nicht Logger. Dies ist der grundlegende Unterschied zwischen Log4j1 und Log4j2 - Logger können in Log4j2 nicht direkt manipuliert werden. Einzelheiten finden Sie unter Log4j2 Architecture.

0
LoggerContext ctx = (LoggerContext) LogManager.getContext(false); 
Collection<? extends Logger> loggers = ctx.getLoggers(); 
+0

Während dieser Code die Frage beantworten kann, zusätzliche Kontext in Bezug auf _why_ und/oder _how_ es Antworten die Frage würde erheblich verbessern seine langfristige Wert. Bitte [bearbeiten] Sie Ihre Antwort, um eine Erklärung hinzuzufügen. –

+0

Beachten Sie, dass der LoggerContext, an den der LoggerContext übergeben wird, der für log4j-core ist - die eigentliche Implementierung. Obwohl dies unwahrscheinlich ist, übernimmt Log4j keine Garantie dafür, dass sich diese Implementierungsklassen nicht von Release zu Release ändern. Beachten Sie auch den Javadoc-Kommentar für diese Methode: "Ob diese Sammlung eine Kopie der zugrunde liegenden Sammlung ist oder nicht, ist nicht definiert. Ändern Sie diese Sammlung daher auf eigenes Risiko." Im aktuellen Code erhalten Sie eine Kopie. – rgoers

0

Es ist wichtig zu beachten, dass LoggerConfig Objekte von getLoggers() und NICHT die Logger selbst zurückgegeben werden. Wie vacant78 gezeigt hat, ist dies nur für die Konfiguration von Loggern geeignet, die noch instanziiert werden müssen. Wenn bereits eine Gruppe von Protokollierern instanziiert wurde, kann die Konfiguration mit dieser Methode nicht geändert werden.

Zum Beispiel, um den Pegel zu ändern während der Laufzeit der Anmeldung finden Sie auf diesen Link, die innerhalb von Apache (keine Überraschung) eine nicht dokumentierte API verwendet, die alle Ihre derzeit instanziiert Logger Ebenen ändern: Programmatically change log level in Log4j2

Verwandte Themen