2013-03-15 60 views
26

是否可以使用XML配置中的規範以編程方式添加Log4J2 appenders?如何在運行時以編程方式添加Log4J2 appenders?

我打算把它定義都在log4j2.xml,然後從中挑選追加程序situationally這樣的(不會編譯):

if (arg[0].equals("log")) { 
    Logger.getLogger("loggerNameFromXMLConfig").addAppender("appenderNameFromXMLConfig"); 
} else { 
    //... 
} 
+3

這幾乎不是重複的,因爲它意味着是一個log4j2問題。鏈接的問題涉及到log4j1(它甚至不公開與log4j2相同的方法)和slf4j。 – 2013-03-19 12:00:10

+1

我不確定那些關閉這個問題的人知道它實際上是什麼。 – 2013-04-28 20:06:16

+0

現在,作爲解決方法,我刪除了log4j2並遷移到允許從XML配置動態構建的Log4J(「Log4J1」)。 – 2013-05-30 16:08:37

回答

15

編輯:爲log4j2的最新版本,請參閱https://stackoverflow.com/a/33472893/1899566代替。

我得到他們不想讓你這樣的印象,但是這對我的作品:

if (arg[0].equals("log")) { 
    org.apache.logging.log4j.Logger logger 
    = org.apache.logging.log4j.LogManager.getLogger("loggerNameFromXMLConfig"); 
    org.apache.logging.log4j.core.Logger coreLogger 
    = (org.apache.logging.log4j.core.Logger)logger; 
    org.apache.logging.log4j.core.LoggerContext context 
    = (org.apache.logging.log4j.core.LoggerContext)coreLogger.getContext(); 
    org.apache.logging.log4j.core.config.BaseConfiguration configuration 
    = (org.apache.logging.log4j.core.config.BaseConfiguration)context.getConfiguration(); 

    coreLogger.addAppender(configuration.getAppender("appenderNameFromXMLConfig")); 
} else { 
    //... 
} 
+0

很漂亮! :) – 2013-08-01 04:56:54

+0

謝謝 - 我用它 - https://codingcraftsman.wordpress.com/2015/04/28/log4j2-mocking-with-mockito-and-junit/ – 2015-04-28 19:50:23

18

已經有很多請求支持更好的Log4j的編程配置2.對不起,花了這麼長時間。從Log4j 2.4起,API被添加到log4j-core以便於programmatic configuration

新的ConfigurationBuilder API允許用戶構建組件定義。使用這個API,不需要直接處理需要大量關於Log4j如何工作的知識的實際配置對象(如LoggerConfig和FileAppender)。組件定義被添加到ConfigurationBuilder中,並且一旦收集完所有的定義,所有的實際配置對象(如Logger和Appender)都被構造。它感覺有點像XML配置語法,只是您正在編寫Java代碼。

請注意,新的ConfigurationBuilder API允許用戶代碼創建新配置或完全替換現有配置。如果您的用例不同,並且您想在Log4j啓動後以編程方式修改(而不是替換)現有配置,那麼您將需要使用實際配置對象。在這種情況下,請參閱手冊的Programmatically Modifying the Current Configuration after Initialization部分。

相關問題