在 Java 中启动 Log4j2 RollingFileAppender



我正在使用log4j2。

我想创建一个滚动文件追加器,它每天轮换日志文件。 在应用程序启动之前,日志文件的名称是未知的(日志文件名是从应用程序配置中组装的(。

这就是为什么我需要在运行时添加一个滚动文件追加器。

我有以下代码:

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

问题是这段代码绝对不会改变任何东西。没有追加程序和记录器被添加到配置中。以编程方式创建的"文件记录器"不可用。

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


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

我的问题:

我的代码有什么问题?为什么我的追加程序和记录器没有添加?分别为什么配置没有刷新/更新?

如何在运行时将滚动文件追加器和记录器添加到 log4j2 配置中?

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

而是使用

Configurator.initialize(BUILDER.build())

我不得不使用

Configurator.reconfigure(BUILDER.build());

这重新加载了配置,我能够查看和使用我的追加器和记录器。

最新更新