如何通过编程正确配置log4j2?

2022-04-12 00:00:00 java log4j log4j2 slf4j
我正在尝试将log4j2设置为使用RollingFileAppender写入日志。我希望以编程方式配置日志记录系统,而不是使用XML文件。

以下是我尝试的内容(与https://logging.apache.org/log4j/2.x/manual/customconfig.html#Configurator中的文档基本相同):

public static void configure(String rootLevel, String packageLevel) {
    ConfigurationBuilder<BuiltConfiguration> builder = ConfigurationBuilderFactory
        .newConfigurationBuilder();

    builder.setConfigurationName("RollingBuilder");
    builder.setStatusLevel(Level.TRACE);

    // Create a rolling file appender

    LayoutComponentBuilder layoutBuilder = builder.newLayout("PatternLayout")
        .addAttribute("pattern", "%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p %c{1}:%L - %m%n");

    ComponentBuilder triggeringPolicy =
        builder
            .newComponent("Policies")
            .addComponent(
                builder
                    .newComponent("SizeBasedTriggeringPolicy")
                    .addAttribute("size", "200M")
            );

    AppenderComponentBuilder appenderBuilder =
        builder
            .newAppender("rolling", "RollingFile")
            .addAttribute("fileName", "log")
            .addAttribute("filePattern", "log.%d.gz")
            .add(layoutBuilder)
            .addComponent(triggeringPolicy);

    builder.add(appenderBuilder);

    // Create new logger

    LoggerComponentBuilder myPackageLoggerBuilder =
        builder.newLogger("com.mypackage", packageLevel)
            .add(builder.newAppenderRef("rolling"))
            .addAttribute("additivity", false);
    builder.add(myPackageLoggerBuilder);

    RootLoggerComponentBuilder rootLoggerBuilder =
        builder
            .newRootLogger(rootLevel)
            .add(builder.newAppenderRef("rolling"));
    builder.add(rootLoggerBuilder);

    // Initialize logging
    Configurator.initialize(builder.build());
}

我在main方法的开头调用configure()方法。我在运行程序时创建了一个名为log的文件,但所有日志输出都进入标准输出,log文件保持为空。

有人能帮我找出我的配置出了什么问题吗?

我没有使用任何log4j配置文件,如果这有什么不同的话。在我的代码中还使用了slf4jAPI。依赖关系-

org.apache.logging.log4j:log4j-api:2.11.1
org.apache.logging.log4j:log4j-core:2.11.1
org.apache.logging.log4j:log4j-slf4j-impl:2.11.1
org.slf4j:slf4j-api:1.7.25

解决方案

请找到示例根日志,最终需要调用重新配置函数。

RootLoggerComponentBuilder rootLogger = builder
   .newRootLogger(Level.ALL)
   .add(builder.newAppenderRef("LogToRollingFile"));

LoggerComponentBuilder logger = builder
   .newLogger("MyClass",Level.ALL)
   .addAttribute("additivity", false);

Configurator.reconfigure(builder.build());

相关文章