在 logback.xml 中屏蔽所有请求和响应

问题描述 投票:0回答:1
spring logging request logback masking
1个回答
0
投票

我理解你的问题的方式是外部配置的记录器不会利用你的掩码。确保正在使用的记录器利用您的掩码的最佳方法是显式配置它们。

您可以使用 Baeldung 教程 配置您自己的面向方面 (AOP) 请求/响应日志记录,并让它使用您已指定的附加程序或您配置的新附加程序。

我正在运行的如下

@Aspect
@Component
@Order(4)
public class RestLoggerAspect {

    Logger logger = LoggerFactory.getLogger(RestLoggerAspect.class);
    String before = "Incoming  :: ";
    String after  = "Completed :: ";

    @Before("execution(@(@org.springframework.web.bind.annotation.RequestMapping *) * *(..))")
    public void log(JoinPoint jp){
        Signature signature = jp.getSignature(); // who is called "class method"
        if(logger.isDebugEnabled()){
            logger.debug(before  + ((Signature) signature).toShortString() + " : " + joinArgs(jp));
        } else {
            logger.info(before  + ((Signature) signature).toShortString());
        }

    }

    @AfterReturning(
            pointcut = "execution(@(@org.springframework.web.bind.annotation.RequestMapping *) * *(..))" ,
            returning= "retVal")
    public void methodLog(JoinPoint jp, Object retVal){
        String methodCall = jp.getSignature().toShortString() ;
        if(logger.isDebugEnabled()){
            String logString = after + methodCall + " [ args = " +joinArgs(jp) + " ]";
            if (retVal != null) {
                logString += " return =  " + prettify(retVal);
            }
            logger.debug(logString);
        } else {
            logger.info(after + methodCall);
        }
    }

    private String joinArgs(JoinPoint jp){
        return Arrays.stream(jp.getArgs())
                .map(t -> t != null ? prettify(t) : "null")
                .collect(Collectors.joining(", "));
    }

    private String prettify(Object object){
        ObjectMapper mapper = new ObjectMapper();
        String jsonStr = null;
        try {
            jsonStr = String.valueOf(object.getClass());
            jsonStr += "=" + mapper.writerWithDefaultPrettyPrinter().writeValueAsString(object);
        } catch (JsonProcessingException e) {
            jsonStr = object.toString();
        }
        return jsonStr;
    }

}

此实现的漂亮打印会将请求/响应转储为多行,这可能不是您正在寻找的内容,但您可以自己删除该部分。这里重要的部分是

@Before
方法允许您访问请求并记录它,在我的例子中,只有当我的 AspectLogger 启用了调试时才可以。
@AfterReturning
位允许您访问响应。我为这些定义的模式在使用 RequestMapping 注释时捕获,例如
@GetMapping
@PostMapping
@DeleteMapping

此处的

joinArgs
函数将连接提供给该方法的所有参数,无论数量如何。

© www.soinside.com 2019 - 2024. All rights reserved.