java - 仅通过代码配置 log4j2 - 以防缺少配置

标签 java log4j2

我想通过代码配置log4j2日志框架,以防在初始化过程中找不到配置文件。

我读到了关于 Programmatic Configuration 的可能性。目前,我能够检测到 log4j 是在没有任何配置的情况下初始化的(ConfigurationSource.NULL_SOURCE),并以编程方式激活我的新默认配置。但在这种情况下,我仍然收到 log4j2 Status Loggor 关于缺少配置的错误消息,我必须停止当前配置并启动新配置。

我想知道是否无法针对我的用例使用 ConfigurationFactory 方法。但我不知道如何将其挂接到初始化过程中,以便仅在没有其他配置方法成功的情况下才激活。我想保留一般配置过程和支持的文件类型不变。

我目前的做法是这样的

@Plugin(name="FooBarConfigurationFactory", category = ConfigurationFactory.CATEGORY)
@Order(0) // should be very low priority
public class FooBarConfigurationFactory extends ConfigurationFactory {

    @Override
    protected String[] getSupportedTypes() {
        // what to return here if the factory should support 'missing' configuration file?
        return new String[] {"*"};
    }

    @Override
    public Configuration getConfiguration(LoggerContext loggerContext, ConfigurationSource source) {
        System.out.println("Get FooBar Configuration..."); // never saw this so far :-(
        return ...;
    }

感谢您的帮助

弗兰兹

最佳答案

有一种方法可能不完美,但我认为可以满足你的需求。

这是一个简短的示例:

Log4j2.java

package test;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.config.plugins.util.PluginManager;

public class Log4j2 {

  private static Logger logger = LogManager.getLogger();

  public static void main(String[] args) {
    logger.info("hello");
  }
}

CustomConfigurationFactory.java

package test;

import java.net.URI;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.appender.ConsoleAppender;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.ConfigurationFactory;
import org.apache.logging.log4j.core.config.ConfigurationSource;
import org.apache.logging.log4j.core.config.Order;
import org.apache.logging.log4j.core.config.builder.api.AppenderComponentBuilder;
import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilder;
import org.apache.logging.log4j.core.config.builder.api.RootLoggerComponentBuilder;
import org.apache.logging.log4j.core.config.builder.impl.BuiltConfiguration;
import org.apache.logging.log4j.core.config.plugins.Plugin;

@Plugin(name = "CustomConfigurationFactory", category = ConfigurationFactory.CATEGORY)
@Order(0)
public class CustomConfigurationFactory extends ConfigurationFactory {

  private static Configuration createConfiguration(
      final String name, ConfigurationBuilder<BuiltConfiguration> builder) {
    builder.setConfigurationName(name);

    AppenderComponentBuilder appenderBuilder =
        builder
            .newAppender("Stdout", "CONSOLE")
            .addAttribute("target", ConsoleAppender.Target.SYSTEM_OUT);
    appenderBuilder.add(
        builder.newLayout("PatternLayout").addAttribute("pattern", "%level: %msg%n"));
    builder.add(appenderBuilder);

    RootLoggerComponentBuilder rootLoggerBuilder = builder.newRootLogger(Level.DEBUG);
    rootLoggerBuilder.add(builder.newAppenderRef("Stdout"));

    builder.add(rootLoggerBuilder);
    return builder.build();
  }

  @Override
  public Configuration getConfiguration(
      final LoggerContext loggerContext, final ConfigurationSource source) {
    return getConfiguration(loggerContext, source.toString(), null);
  }

  @Override
  public Configuration getConfiguration(
      final LoggerContext loggerContext, final String name, final URI configLocation) {
    ConfigurationBuilder<BuiltConfiguration> builder = newConfigurationBuilder();
    return createConfiguration(name, builder);
  }

  @Override
  protected String[] getSupportedTypes() {
    return new String[] {".code"}; // IMPORTANT
  }
}

然后在src/main/resources中创建一个名为log4j2.code的空文件.

注意:

最重要的是确保suffix您的自定义 log4j2 配置资源文件的返回值对应于 CustomConfigurationFactory.getSupportedTypes方法。


更新

如果 log4j2 找不到 CustomConfigurationFactory插件,尝试启用注释处理。

关于java - 仅通过代码配置 log4j2 - 以防缺少配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43363026/

相关文章:

java - 使用 Java 中的 log4j2 进行 Windows 事件日志记录

java - 动态创建新的滚动文件 LOG4j2 2.6

java - 应用程序关闭时清理 JSF session 范围 bean

java - 如何获取上一行arraylist java的某个单元格

java - Spring Security - Thymeleaf - 我可以在秒内评估 SPEL 表达式 :authorize tags?

logging - Log4j2 文件已创建但未写入日志

java - log4J2 存储和使用变量/查找值

使用 log4j2.xml 的 tomcat 7 内部日志记录

Java : Object access with private fields

Java覆盖两个接口(interface),方法名称冲突