logger.setLevel()方法在log4j2 API中不可用。那麼如何在運行時設置日誌級別。如何在運行時使用log4j2 api將loglevel從INFO設置爲ERROR?
回答
我不知道這是否是最好的方式,但你設定的水平上org.apache.logging.log4j.core.config.LoggerConfig您可以從通過日誌管理的LoggerContext得到。
設置後,您可以使用新配置更新記錄器。
舉個例子:
public static void main(String[] args) {
Logger log = LogManager.getLogger(LogManager.ROOT_LOGGER_NAME);
log.error("An error");
log.debug("A debug");
LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
Configuration conf = ctx.getConfiguration();
conf.getLoggerConfig(LogManager.ROOT_LOGGER_NAME).setLevel(Level.DEBUG);
ctx.updateLoggers(conf);
log.error("Another error");
log.debug("Another debug");
}
產量:
14:03:41.346 [main] ERROR - An error
14:03:41.348 [main] ERROR - Another error
14:03:41.348 [main] DEBUG - Another debug
感謝amcintosh,我包了answer的功能:
/** Override the logging level of a given logger, return the previous level */
public static Level setLevel(Logger log, Level level) {
LoggerContext ctx = (LoggerContext)LogManager.getContext(false);
Configuration conf = ctx.getConfiguration();
LoggerConfig lconf = conf.getLoggerConfig(log.getName());
Level oldLevel = lconf.getLevel();
lconf.setLevel(level);
ctx.updateLoggers(conf);
return oldLevel;
}
儘管AMOE的評論,這似乎對於使用Log4J 2.5的我來說工作正常。
它可以配置爲特定線程嗎?行爲與ThreadContext相同。 – theGamblerRises
@theGamblerRises我建議發佈一個單獨的問題,而不是試圖在評論中探討這一點。我認爲你不能用這種機制控制每個線程的日誌級別,但也可能有其他方法來做你想做的事情。如果您發佈單獨的問題,請隨時在此處分享鏈接。 – dimo414
在我身邊,我不得不使用這段代碼才能使這個工作正常(根據以前的答案)。
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.config.AbstractConfiguration;
...
public static void changeLoggerLevel(final String module, final Level level) {
String moduleRenamed = module.replaceAll("/", ".");
LoggerContext ctx = (LoggerContext)LogManager.getContext(false);
AbstractConfiguration configuration = (AbstractConfiguration) ctx
.getConfiguration();
if (configuration.getLogger(moduleRenamed) != null) {
LoggerConfig loggerConfig = configuration.getLoggerConfig(moduleRenamed);
loggerConfig.setLevel(level);
} else {
LoggerConfig loggerConfig = new LoggerConfig(moduleRenamed, level, true);
configuration.addLogger(moduleRenamed, loggerConfig);
}
ctx.updateLoggers(configuration);
}
問題出在getLoggerConfig()
調用;如果您嘗試提供新級別的模塊尚未註冊,則此方法將返回根記錄器(或已註冊的任何中間子路徑),因此您將改爲root
或com
級別,而不是更改com.mycompany
的級別。這就是爲什麼你必須添加一個新的LoggerConfig
萬一要更改的模塊尚未註冊。
加里·格雷戈裏是正確的。
同樣,這個問題的答案就在那裏的FAQ頁面上log4j2的網站下面
https://logging.apache.org/log4j/2.x/faq.html#reconfig_level_from_code
示例代碼:
Configurator.setLevel(logger.getName(), Level.INFO);
雖然這可能在理論上回答這個問題,[這將是更可取的](/ meta.stackoverflow.com/q/8259)在這裏包括答案的基本部分,並提供鏈接供參考。 – Draken
使用代碼示例更新了答案。 –
- 1. 如何設置Loglevel進行JUnit測試
- 2. 如何在構建時將Gendarme設置爲使用Teamcity運行?
- 3. Log4j2,在運行時爲特定線程設置日誌級別
- 4. 如何運行--info
- 5. 從log4j2運行時屬性的主題值設置,SMTPAppender
- 6. 如何將logLevel設置爲log4net的hangfire錯誤
- 7. 在運行時將Appbase設置爲空
- 8. IsHandledCreated設置爲false,但在運行時將其設置爲true?
- 9. Marker和Loglevel的log4j2過濾器
- 10. 如何在運行時將文本設置爲null的JTextFields?
- 11. 如何在運行時將rowstate屬性設置爲Deleted?
- 12. 如何在運行時將指針設置爲空(C++)
- 13. 如何將cron作業設置爲在準確時間運行?
- 14. 在Intellji Junit中配置LogLevel在Gradle項目中運行配置?
- 15. 將運行時設置爲IFacetedProject
- 16. 將值運行時間設置爲combobox
- 17. 無法在config中設置mod_rewrite LogLevel
- 18. Log4J仍然運行Log4j2
- 19. 如何在運行時設置字段
- 20. 如何設置text_selector在運行時
- 21. 如何在運行時設置Maven artifactId?
- 22. 如何設置在運行時
- 23. 如何在運行時設置xml:lang值?
- 24. 如何在運行時設置java.net.preferIPv4Stack = true?
- 25. ,如何在運行時設置類型?
- 26. 如何在廚師的運行時爲用戶設置密碼
- 27. 如何在運行時以編程方式添加Log4J2 appenders?
- 28. 運行Django測試時,如何將DEBUG設置爲True?
- 29. 如何將cron作業設置爲每3小時運行
- 30. 如何設置log4j2.xml配置狀態
的可能的複製[編程改變Log4j2日誌級別] (http://stackoverflow.com/questions/23434252/programmatically-change-log-level-in-log4j2) –