簡體   English   中英

在 Java 中啟動 Log4j2 RollingFileAppender

[英]Initiate Log4j2 RollingFileAppender in Java

我正在使用 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;  
}

問題是這段代碼完全沒有改變。 沒有附加程序和記錄器被添加到配置中。 以編程方式創建的“FileLogger”不可用。

執行上述代碼,我使用此代碼打印記錄器和附加程序。


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);
      }
   }
}

Output:

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


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

我的問題:

我的代碼有什么問題? 為什么我的 Appender 和我的 Logger 沒有添加? 分別為什么沒有刷新/更新配置?

如何在運行時將 RollingFileAppender 和記錄器添加到 log4j2 配置中?

我找到了解決我的問題的方法。

而是使用

Configurator.initialize(BUILDER.build())

我不得不使用

Configurator.reconfigure(BUILDER.build());

這重新加載了配置,我能夠看到並使用我的 appender 和 logger。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM