我一直在尝试使用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());
}
因此控制台按预期输出。并创建一个空的日志文件,但它不会向文件输出任何内容。
答案 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")));