我正在尝试理解log4j2的编程方面,因为我正在迁移大量的log4j 1.2代码。以下似乎非常不同,也很复杂:
org.apache.log4j.Logger.getRootLogger().setLevel(Level.FATAL);
org.apache.log4j.Logger.getRootLogger().addAppender(new ConsoleAppender(new PatternLayout(PatternLayout.TTCC_CONVERSION_PATTERN), "System.err"));
有足够log4j2经验的人可以向我解释一下迁移上述2行的简单方法是什么?
编辑:这是我到目前为止所做的:
LoggerContext context = (LoggerContext) LogManager.getContext(false);
Configuration config = context.getConfiguration();
config.getLoggerConfig(LogManager.ROOT_LOGGER_NAME).setLevel(Level.FATAL);
PatternLayout patternLayout = PatternLayout.createLayout(PatternLayout.TTCC_CONVERSION_PATTERN, config, null, null, true, true, null, null);
Layout<? extends Serializable> layout = patternLayout;
ConsoleAppender consoleAppender = ConsoleAppender.createAppender(layout , null, "SYSTEM_ERR", "System.err", null, null);
consoleAppender.start();
config.addAppender(consoleAppender);
context.updateLoggers();
这是不是很复杂,对吧?
答案 0 :(得分:1)
不幸的是,创建编程配置并不是Log4j2的主要关注点。您可以查看他们的AbstractConfiguration class sources第580行,了解如何在内部以编程方式设置默认配置。
Log4j2库对不同类型的配置文件(xml,json,properties,yaml)有很好的支持,或者您可以从多个源构建复合配置。它还跟踪配置文件,并能够动态重新加载。
我会建议您评估上面提到的功能,以便从代码更新配置。 E.g。
final URL log4j = Resources.getResource("log4j2-test.xml");
ConfigurationSource configurationSource = new ConfigurationSource(
Resources.asByteSource(log4j).openStream(), log4j);
LoggerContext context = LoggerContext.getContext(false);
XmlConfiguration xmlConfiguration = new XmlConfiguration(context, configurationSource);
context.start(xmlConfiguration);
使用更大的配置似乎比编程方式更容易管理。