我正在使用log4j2。

我想创建一个RollingFileAppender,它每天轮换日志文件。
在应用程序启动之前,日志文件的名称是未知的(日志文件名称是从应用程序配置中汇编的)。

这就是为什么我需要在运行时添加RollingFileAppender的原因。

我有以下代码:

public static final ConfigurationBuilder<BuiltConfiguration> BUILDER = ConfigurationBuilderFactory.newConfigurationBuilder

public void initFileLoggerWithFilePattern(final String pattern) {
   final LoggerComponentBuilder   logger   = BUILDER.newLogger("FileLogger", Level.DEBUG);
   final AppenderComponentBuilder appender = createFileAppenderWithFilePattern(pattern);

   BUILDER.add(appender);

   logger.add(BUILDER.newAppenderRef("RollingFileAppender"));

   BUILDER.add(logger);

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

public AppenderComponentBuilder createFileAppenderWithFilePattern(final String pattern) {
   final AppenderComponentBuilder acb = BUILDER.newAppender("RollingFileAppender", "RollingFile");
   acb.addAttribute("fileName",    pattern);
   acb.addAttribute("filePattern", pattern);
   acb.addComponent(createPatternLayout());
   acb.addComponent(createTimeBasedTriggeringPolicy());

   return acb;
}

public LayoutComponentBuilder createPatternLayout() {
   final LayoutComponentBuilder lcb = BUILDER.newLayout("PatternLayout");
   lcb.addAttribute("pattern", "%d{yyyy-MM-dd HH:mm:ss.SSS}{GMT}Z %m");

   return lcb;
}

public ComponentBuilder createTimeBasedTriggeringPolicy() {
   final ComponentBuilder policies = BUILDER.newComponent("Policies");
   final ComponentBuilder policy   = BUILDER.newComponent("TimeBasedTriggeringPolicy");

   policies.addComponent(policy);

   return policies;
}


问题在于此代码绝对不会更改任何内容。没有追加程序,也没有Logger被添加到配置中。以编程方式创建的“ FileLogger”不可用。

执行上述代码后,我使用此代码打印记录器和Appender。


private void printLog4jConfig() {
   final LoggerContext context = (LoggerContext) LogManager.getContext(false);
   final Configuration config  = context.getConfiguration();


   // Print appenders
   for(Appender app : config.getAppenders().values()) {
      System.out.println(app.getName());
   }

   // Print Loggers and their Appenders
   for(LoggerConfig lc : config.getLoggers().values()) {
      System.out.println(lc);

      for(Appender app : lc.getAppenders().values()) {
         System.out.println("   " + app);
      }
   }
}



输出:

Appenders
-------------
STDOUT


Loggers
-------------
root
   STDOUT
Console
   STDOUT


我的问题:

我的代码有什么问题?为什么未添加我的Appender和Logger?为何分别不刷新/更新配置?

如何在运行时将RollingFileAppender和记录器添加到log4j2配置中?

最佳答案

我找到了解决我问题的方法。

代替使用

Configurator.initialize(BUILDER.build())

我不得不用

Configurator.reconfigure(BUILDER.build());

这样就重新加载了配置,我能够看到和使用我的appender和logger。

关于java - 在Java中启动Log4j2 RollingFileAppender,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/62192721/

10-11 10:55