以编程方式设置log4j2文件appender

时间:2017-11-07 16:16:20

标签: java log4j2

我一直在尝试使用log4j v2.7构建Java应用程序。我有一些命令行参数,允许用户配置log4j所以我试图以编程方式配置它。

这是函数(主要从log4j文档中复制)

public static void configureLogging(String path) {
    ConfigurationBuilder<BuiltConfiguration> builder = ConfigurationBuilderFactory.newConfigurationBuilder();
    LayoutComponentBuilder layoutBuilder = builder.newLayout("PatternLayout").addAttribute("pattern", "%d [%t] %-5level: %msg%n%throwable");

    builder.setStatusLevel(Level.ALL);
    builder.setConfigurationName("BuilderTest");
    AppenderComponentBuilder appenderBuilder = builder.newAppender("Stdout", "CONSOLE")
            .addAttribute("target", ConsoleAppender.Target.SYSTEM_OUT);
    appenderBuilder.add(layoutBuilder);

    builder.add(appenderBuilder);
    builder.add(builder.newLogger("Console", Level.ALL).add(builder.newAppenderRef("Stdout")));

    appenderBuilder = builder.newAppender("file_log", "File")
        .addAttribute("fileName", path)
        .addAttribute("append", false)
        .add(layoutBuilder);
    builder.add(appenderBuilder);

    builder.add(builder.newRootLogger(Level.ALL).add(builder.newAppenderRef("Stdout")));
    builder.add( builder.newRootLogger( Level.ALL ).add( builder.newAppenderRef("file_log")));

    Configurator.initialize(builder.build());
}

因此控制台按预期输出。并创建一个空的日志文件,但它不会向文件输出任何内容。

1 个答案:

答案 0 :(得分:1)

我认为问题在于您在以下行中创建RootLogger个实例2次 -

builder.add(builder.newRootLogger(Level.ALL).add(builder.newAppenderRef("Stdout")));
builder.add( builder.newRootLogger( Level.ALL ).add( builder.newAppenderRef("file_log")));

尝试使用以下代替2行以上的行 -

builder.add(builder.newRootLogger(Level.ALL).add(builder.newAppenderRef("Stdout")).add(builder.newAppenderRef("file_log")));