在 Java 中启动 Log4j2 RollingFileAppender

Posted

技术标签:

【中文标题】在 Java 中启动 Log4j2 RollingFileAppender【英文标题】:Initiate Log4j2 RollingFileAppender in Java 【发布时间】:2020-09-23 07:48:05 【问题描述】:

我正在使用 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", "%dyyyy-MM-dd HH:mm:ss.SSSGMTZ %m");

   return lcb;


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

   policies.addComponent(policy);

   return policies;  

问题是这段代码完全没有改变。没有附加程序和记录器被添加到配置中。以编程方式创建的“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 没有添加?分别为什么配置没有被刷新/更新?

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

【问题讨论】:

如果记录器在成功启动之前不记录,您将如何捕获应用程序启动失败? @user872858 在应用程序真正开始处理之前,它会登录到控制台。像无效参数等一切。它读取它的配置并(如果成功)实例化上面提到的记录器。然后它开始处理。因此,在记录器被实例化之前,应用程序不会处理任何事情。在那之前的一切都只是用户对他给出的参数以及配置文件是否正确的反馈。 【参考方案1】:

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

改为使用

Configurator.initialize(BUILDER.build())

我不得不使用

Configurator.reconfigure(BUILDER.build());

这重新加载了配置,我可以看到并使用我的 appender 和 logger。

【讨论】:

以上是关于在 Java 中启动 Log4j2 RollingFileAppender的主要内容,如果未能解决你的问题,请参考以下文章

在 Rolling Update 中使用 Health Check转

并非每个日志都使用 LOG4j2 属性文件在日志文件中打印

rolling方式修改oplog

春季启动战争log4j2

Log4j2 在尝试启动 Sonar Qube 本地实例时找不到日志记录实现

在 Rolling Update 中使用 Health Check - 每天5分钟玩转 Docker