当前位置: 首页 > 知识库问答 >
问题:

如何在运行时向根记录器添加PatternLayout?

郎飞航
2023-03-14
@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;
}
<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>

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

共有1个答案

何浩荡
2023-03-14

您好,Max,我希望您使用的是log4j2.x,因为这个解决方案使用了log4j2.x中引入的插件approache。首先,您应该创建一个包,在其中放置插件类,您将这两个类放在那里:

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

    }

My.log4j.pluggins.SampleLayout:

    @Plugin(name = "CustomConverter", category = "Converter")
    @ConverterKeys({"myMsg"})
    public class SampleLayout extends LogEventPatternConverter {

        protected SampleLayout(String name, String style) {
            super(name, style);
        }
        public static SampleLayout newInstance(){
            return new SampleLayout("custConv", "custConv");
        }

        @Override
        public void format(LogEvent event, StringBuilder stringBuilder) {
           //replace the %myMsg by XXXXX if sensitive           
           if (sensitive()){
               stringBuilder.append("XXXX");}
           else {
            stringBuilder.append(event.getMessage().getFormattedMessage());}            
        }   
    }
ConfigurationFactory.setConfigurationFactory(new CustomConfigurationFactory());
 类似资料:
  • 问题内容: 我们在项目中使用LogBack,我想根据一些数据库值配置logger,即如果某个DB值设置为true,则logger应该同时使用文件和数据库附加程序,如果为false,则logger必须仅使用DB附加程序, 我也想保留使用静态最终记录器,因此不会在每次调用记录器时都创建一个新实例, 那我该怎么做呢? 问候, 问题答案: 您应该按照本示例中的说明以编程方式配置Logback 。

  • 当Java11排除了JavaFX作为最新版本的一部分时,我得到了以下错误。 那么如何在Java11中将JavaFX添加到Eclipse中呢?谢了。

  • 我是Spring的新手。我有下面的Person bean,其中包含姓名、地址和年龄作为属性。现在我想在我的自定义BeanFactoryPostProcess中向Person bean添加名为性别的新属性。我的人bean实现了属性访问器。 XML配置文件 自定义BeanFactoryPostProcess 人员类别 客户端程序 如果我访问性别我得到null 请让我知道如何动态设置和获取属性。

  • 我通过HiberNate将用户保存在DB表中,我使用Spring Security进行身份验证: 这非常有效,但有一点需要注意:用户在服务器启动时被加载。我需要编写方法RegisterUser(用户用户),在运行时将新用户添加到Spring Security。这种方法应该只关注这项任务。我不知道如何开始实现这个功能,所以谢谢你的建议!;) Ofc用户有登录名、密码、角色字符串等字段。。。 请不要发

  • 我在XML中指定log4j2 logger的文件名,如下所示。一切正常,但我得到了错误 2017-09-06 16:54:33,496主要错误未知的对象"RlandAccessFileAppender的类型org.apache.logging.log4j.core.appender.RlandAccessFileAppender被忽略:尝试嵌套它在其中之一:["Appender","Logger"

  • 这是我的超文本标记语言PHP表页面的完整代码...