2013-07-07 41 views

回答

4

看起來像我已經找到了辦法:

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

得到log4j2使用的所有記錄儀:

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

注意:

使用org.apache.logging.log4j.core.LoggerContext

不org.apache.logging.log4j.spi .LoggerContext

+0

它就像一個魅力。 – zygimantus

+0

使用2.6.2,沒有'LoggerContext.getConfiguration()' –

+0

使用像org.apache.logging.log4j.core.LoggerContext logContext =(org.apache.logging.log4j.core.LoggerContext)LogManager .getContext假); – zhukunqian

2

YuriR的回答是不完整的,因爲它沒有指出LoggerConfig對象被返回,而不是Logger。這是Log4j1和Log4j2之間的根本區別 - 在Log4j2中無法正確操作記錄器。詳情請參閱Log4j2 Architecture

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

儘管此代碼可能回答此問題,但提供 有關_why_和/或_how_的其他上下文,它將回答 該問題將顯着提高其長期值 的值。請[編輯]你的答案,添加一些解釋。 –

+0

請注意,被輸出到的LoggerContext是log4j-core的實際實現。雖然不太可能,但Log4j不保證這些實現類不會從發佈版本更改爲發佈版本。還要注意該方法的javadoc註釋:「該集合是否是底層集合的副本是未定義的,因此,修改此集合需要您自擔風險。」在當前的代碼中,您將獲得一份副本。 – rgoers

0

重要的是要注意LoggerConfig對象是由getLoggers()而不是記錄器本身返回的。正如vacant78指出的那樣,這隻適用於爲尚未實例化的記錄器設置配置。如果您已經有一些已經實例化的記錄器,那麼使用此方法更改配置就沒有用。

例如,在運行時更改記錄的水平,參考此鏈接,它利用內阿帕奇一個未公開的API(這並不奇怪),這將改變當前所有的實例化的記錄器級別:Programmatically change log level in Log4j2

相關問題