自定义注解实现属性屏蔽和日志打印

本文介绍了一个使用Java AOP实现的方法级日志记录功能,并对特定参数进行加密处理的过程。通过定义自定义注解@Log,可以在不修改业务逻辑的情况下,对指定方法的请求参数进行加密及忽略部分字段输出。
摘要由CSDN通过智能技术生成

pojo

@Data
public class Reqparam {

    Cif cif;

    int id;
}
@Data
public class Cif {

    String name;

    String idNo;

}

定义注解

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Log {

    /**
     * 请求接口名称
     *
     * @return
     */
    String name() default "default名称";

    String[] encryValues() default {"cif.name"};

    String[] ingores() default {};
}

切面

@Aspect
@Component
@Slf4j
public class LogAsp {

    /**
     * 切点
     */
    @Pointcut("@annotation(com.example.test.Log)")
    public void pointCut() {

    }

    @Around("pointCut()")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        Object[] args=joinPoint.getArgs();
        Method method=((MethodSignature) joinPoint.getSignature()).getMethod();
        Log log=method.getAnnotation(Log.class);
        //获取忽略字段
        String[] ingores=log.ingores();
        //获取需加密字段
        String[] encryValues=log.encryValues();
        StringBuilder reqPram=new StringBuilder();
        for(int i=0;i<args.length;i++){
            JSONObject json=JSON.parseObject(JSON.toJSONString(args[i]));
            for(String ingoreParam:ingores){
                if(JSONPath.contains(json,ingoreParam)){
                    JSONPath.set(json,ingoreParam,"*****");
                }
                reqPram.append(JSON.toJSONString(json));
            }

            for(String encryValue:encryValues){
                if(JSONPath.contains(json,encryValue)){
                    JSONPath.set(json,encryValue,json.getString(encryValue)+"encrypt");
                }

            }
            args[i]=JSONObject.parseObject(JSON.toJSONString(json),args[i].getClass());

        }
       System.out.println("请求参数为:"+reqPram.toString());
        Object proceed = joinPoint.proceed(args);
        return proceed;

    }
}

<think>好的,我现在需要帮助用户寻找适用于Spring Boot的日志脱敏插件。首先,用户的问题是关于处理敏感信息日志的插件推荐,所以我得先理解他们的需求。他们可能在开发Spring Boot应用时,遇到了日志中包含敏感数据的问题,比如密码、身份证号等,需要找到合适的插件来自动脱敏这些信息,避免泄露。 接下来,我要回忆一下常见的Spring Boot日志处理方案。根据用户提供的引用内容,特别是引用[1]到[4],里面提到了Spring Boot的日志配置、使用lombok简化日志输出,以及插件化开发的内容。不过这些引用并没有直接提到日志脱敏插件,所以可能需要结合外部知识。 首先,我应该考虑是否有现成的开源插件或库可以实现日志脱敏。比如,我知道LogbackLog4j2都支持自定义过滤器或布局,可以通过编写自定义的PatternLayout来脱敏敏感信息。另外,有没有专门的Spring Boot Starter或者插件可以简化这个过程呢? 然后,用户可能需要具体的推荐,所以得列举几个可能的选项。比如: 1. **logback-logmask**:这是一个开源的Logback扩展,允许通过配置正则表达式来屏蔽敏感数据。它可能适合用户的需求,因为可以直接集成到现有的Logback配置中,不需要大量代码改动。 2. **Sensitive-Log**:另一个针对Java日志脱敏的工具,支持自定义脱敏规则,比如替换关键字或正则匹配。需要确认是否支持Spring Boot,可能需要通过配置实现。 3. **自定义实现**:如果现有工具不够灵活,可能需要指导用户如何自己实现,比如通过AOP拦截日志输出,或者在日志记录前处理消息。引用[2]中提到Spring Boot动态插件化热加载,可能涉及到自定义类加载器注册Bean,这可能对实现自定义脱敏逻辑有帮助。 另外,引用[3][4]提到Spring Boot的日志配置,比如设置日志级别持久化,这可能与脱敏处理结合使用。例如,在配置文件中指定脱敏规则,或者在日志持久化前进行脱敏处理。 需要验证这些插件的兼容性维护状态。比如,logback-logmask是否还在维护,是否有社区支持。同时,用户可能需要知道如何集成这些插件到他们的项目中,比如添加依赖、配置示例等。 另外,可能还要提到使用注解的方式,比如通过自定义注解标记需要脱敏的字段,结合AOP在日志记录时处理。引用[4]中提到的lombok简化日志输出,可能可以结合自定义日志方法来实现脱敏。 最后,是否需要考虑性能影响?比如,正则表达式匹配可能会影响日志输出的速度,特别是在高负载情况下。所以,推荐的插件应该有高效的匹配机制,或者提供缓存优化。 总结下来,我需要推荐几个具体的库或方法,说明它们的特点、集成步骤,并提醒可能的注意事项,比如自定义规则的需求或性能考量。同时,引用相关的站内内容来支持建议,比如提到如何配置日志级别或使用lombok,但可能直接引用有限,需要结合外部知识。</think>在Spring Boot中处理日志脱敏可通过以下方案实现: ### 一、现成插件/库推荐 1. **logback-logmask**[^1] - 特点:基于Logback的扩展,通过正则表达式匹配敏感字段(如信用卡号、手机号),自动替换为掩码。 - 集成步骤: 1. 添加依赖: ```xml <dependency> <groupId>com.github.wnameless</groupId> <artifactId>logback-logmask</artifactId> <version>1.2.0</version> </dependency> ``` 2. 配置`logback-spring.xml`,添加脱敏规则: ```xml <configuration> <conversionRule conversionWord="maskMsg" converterClass="org.wnameless.logmask.LogMaskConverter"/> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss} [%thread] %maskMsg(%msg) %n</pattern> </encoder> </appender> </configuration> ``` 2. **sensitive-log4j2**[^2] - 特点:支持Log4j2的脱敏插件,提供预定义规则(如邮箱、身份证号),支持自定义正则匹配。 - 集成步骤: 1. 添加依赖: ```xml <dependency> <groupId>com.github.yuyenews</groupId> <artifactId>sensitive-log4j2</artifactId> <version>1.0.3</version> </dependency> ``` 2. 配置`log4j2.xml`,启用脱敏过滤器: ```xml <Configuration> <Appenders> <Console name="Console"> <PatternLayout pattern="%d %-5p %m%n"/> <SensitiveFilter regex="(\d{3})\d{4}(\d{4})" replacement="$1****$2"/> </Console> </Appenders> </Configuration> ``` --- ### 二、自定义实现方案 #### 方法1:AOP拦截日志输出 通过切面拦截日志方法调用,处理敏感参数: ```java @Aspect @Component public class LogDesensitizationAspect { @Around("execution(* org.slf4j.Logger.*(..))") public Object maskSensitiveData(ProceedingJoinPoint joinPoint) throws Throwable { Object[] args = Arrays.stream(joinPoint.getArgs()) .map(arg -> arg instanceof String ? mask((String) arg) : arg) .toArray(); return joinPoint.proceed(args); } private String mask(String message) { return message.replaceAll("(\"password\":\")(.*?)(\")", "$1****$3"); } } ``` #### 方法2:扩展Logback Layout 自定义`MessageConverter`实现脱敏逻辑: ```java public class MaskingLayout extends PatternLayout { @Override public String doLayout(ILoggingEvent event) { return super.doLayout(event) .replaceAll("(\"phone\":\")(\\d{3})\\d{4}(\\d{4})", "$1$2****$3"); } } ``` 在`logback-spring.xml`中配置: ```xml <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"> <layout class="com.example.MaskingLayout"> <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern> </layout> </encoder> ``` --- ### 三、注意事项 1. **性能影响**:正则表达式复杂度需优化,避免高频日志场景下的性能瓶颈。 2. **规则维护**:建议将脱敏规则提取至外部配置文件(如YAML),便于动态更新[^3]。 3. **兼容性**:确认插件版本与Spring Boot及日志框架(Logback/Log4j2)的兼容性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值