Java 如何在运行时将PatternLayout添加到根记录器?

Java 如何在运行时将PatternLayout添加到根记录器?,java,logging,logback,Java,Logging,Logback,我使用logback作为Slf4j的后端。目前,我使用logback.xml文件配置记录器。我的问题是正在记录敏感信息(我无法控制),我想屏蔽这些敏感信息。为了屏蔽这些信息,我编写了一个定制的PatternLayout类,它基本上可以: @Override public String doLayout(ILoggingEvent event) { String message = super.doLayout(event); Matcher matcher = sesnsitiv

我使用logback作为Slf4j的后端。目前,我使用
logback.xml
文件配置记录器。我的问题是正在记录敏感信息(我无法控制),我想屏蔽这些敏感信息。为了屏蔽这些信息,我编写了一个定制的
PatternLayout
类,它基本上可以:

@Override
public String doLayout(ILoggingEvent event) {
    String message = super.doLayout(event);
    Matcher matcher = sesnsitiveInfoPattern.matcher(message);
    if (matcher.find()) {
        message = matcher.replaceAll("XXX");
    }
    return message;
}
我的问题是,我需要告诉logback使用这个自定义模式布局。但是,我不想将其添加到XML配置中。我当前的配置如下所示:

<configuration> 
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
    <encoder>
      <layout class="com.my.MaskingPatternLayout"> <!-- here -->
        <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
      </layout>
    </encoder>
  </appender>

  <root level="info">
    <appender-ref ref="STDOUT" />
  </root>
</configuration>

%d{HH:mm:ss.SSS}[%thread]-5级别%logger{36}-%msg%n

在XML中,我想要的配置如下所示(但我不想使用XML):

你好,Max我希望您使用的是Log4j 2.x,因为此解决方案使用Log4j 2.x中引入的插件方法。首先,您应该创建一个包,在其中放置插件类,并放置以下两个类:

my.log4j.pluggins.CustomConfigurationFactory:

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

        private Configuration createConfiguration(final String name,
                ConfigurationBuilder<BuiltConfiguration> builder) {
            System.out.println("init logger");
            builder.setConfigurationName(name);
            builder.setStatusLevel(Level.INFO);
            builder.setPackages("my.log4j.pluggins");
            AppenderComponentBuilder appenderBuilder = builder.newAppender(
                    "Stdout", "CONSOLE").addAttribute("target",
                    ConsoleAppender.Target.SYSTEM_OUT);
            appenderBuilder
                    .add(builder
                            .newLayout("PatternLayout")
                            .addAttribute("pattern", "%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %myMsg%n"));
            builder.add(appenderBuilder);
            builder.add(builder.newRootLogger(Level.TRACE).add(
                    builder.newAppenderRef("Stdout")));
            return builder.build();
        }

        @Override
        protected String[] getSupportedTypes() {
            String[] supportedExt = { "*" };
            return supportedExt;

        }

        @Override
        public Configuration getConfiguration(ConfigurationSource source) {
            ConfigurationBuilder<BuiltConfiguration> builder = newConfigurationBuilder();
            return createConfiguration(source.toString(), builder);
        }

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

    }
CustomConfiguration类负责创建log4j和第9行的配置,其中“builder.setPackages(“my.log4j.pluggins”)”对于扫描该包和提取转换器插件(即SampleLayout)非常重要。 第二个类将负责在包含我的敏感消息的模式中格式化新密钥“%myMsg”,此转换器类将检查该消息是否敏感并相应地执行操作

在开始记录日志之前,应该像这样配置log4j

ConfigurationFactory.setConfigurationFactory(new CustomConfigurationFactory());
ConfigurationFactory.setConfigurationFactory(new CustomConfigurationFactory());