我理解你的问题的方式是外部配置的记录器不会利用你的掩码。确保正在使用的记录器利用您的掩码的最佳方法是显式配置它们。
您可以使用 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
函数将连接提供给该方法的所有参数,无论数量如何。