@Slf4j
@Aspect
@Component
public class ControllerLog {
private final ThreadLocal<Long> startTimeThreadLocal =
new NamedThreadLocal<>("ThreadLocal StartTime");
private final ThreadLocal<String> logPrefixThreadLocal =
new NamedThreadLocal<>("ThreadLocal LogPrefix");
@Autowired
private ObjectMapper objectMapper;
/**
* <li>Before : 在方法执行前进行切面</li>
* <li>execution : 定义切面表达式</li>
* <p>public * com.test.controller..*.*(..)
* <li>public :匹配所有目标类的public方法,不写则匹配所有访问权限</li>
* <li>第一个* :方法返回值类型,*代表所有类型 </li>
* <li>第二个* :包路径的通配符</li>
* <li>第三个..* :表示controller这个目录下所有的类,包括子目录的类</li>
* <li>第四个*(..) : *表示所有任意方法名,..表示任意参数</li>
* </p>
*/
@Pointcut("execution(public * com.test.controller..*.*(..))")
public void executionMethod() {
// do nothing
}
@Before("executionMethod()")
public void doBefore(JoinPoint joinPoint) {
startTimeThreadLocal.set(System.currentTimeMillis());
StringBuilder argsDes = new StringBuilder();
//获取类名
String className = joinPoint.getSignature().getDeclaringType().getSimpleName();
//获取方法名
String methodName = joinPoint.getSignature().getName();
String logPrefix = className + CommonConstant.DOT + methodName;
logPrefixThreadLocal.set(logPrefix);
try {
//获取传入目标方法的参数
Object[] args = joinPoint.getArgs();
for (int i = 0; i < args.length; i++) {
String jsonArgs = objectMapper.writeValueAsString(args[i]);
argsDes.append("第").append(i + 1).append("个参数为:").append(jsonArgs).append(CommonConstant.COMMA);
}
if (argsDes.length() > 0) {
argsDes.deleteCharAt(argsDes.length() - 1);
}
} catch (Exception e) {
log.error("[{}]异常", logPrefix, e);
}
log.info("[{}]入参为:[{}]", logPrefix, argsDes);
}
@AfterReturning(pointcut = "executionMethod()", returning = "rtn")
public Object doAfter(Object rtn) {
long endTime = System.currentTimeMillis();
long begin = startTimeThreadLocal.get();
String logPrefix = logPrefixThreadLocal.get();
String jsonArgs = null;
try {
jsonArgs = objectMapper.writeValueAsString(rtn);
} catch (Exception e) {
log.error(logPrefix + "异常", e);
}
log.info("[{}]出参为:[{}],耗时:[{}]", logPrefix, jsonArgs, endTime - begin);
destroyThreadLocal();
return rtn;
}
private void destroyThreadLocal() {
startTimeThreadLocal.remove();
logPrefixThreadLocal.remove();
}
}
aop实现请求入参出参日志打印
最新推荐文章于 2023-12-25 09:45:37 发布