log4j到log4j2迁移的等效编程记录器初始化

时间:2017-10-17 17:19:54

标签: java logging log4j log4j2

我正在尝试理解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();

这是不是很复杂,对吧?

1 个答案:

答案 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);

使用更大的配置似乎比编程方式更容易管理。