需求目的:对目前项目中的各种方法进行打印其日志信息,方便bug排查
方法采用切面方法进行打印:
设置注解类
/**
* 日志注解
*/
public @interface OperateLog {
}
设置切面类:
@Aspect
@Slf4j
@Component
public class OperateLogAspect {
/**
* 打印日志
*
* @param joinPoint
* @throws Throwable
*/
@Around("@annotation(com.dianping.credit.console.aspect.OperateLog)&& execution(public * *(..))")
public void operateLog(ProceedingJoinPoint joinPoint) throws Throwable {
String className = joinPoint.getTarget().getClass().getSimpleName();
String method = joinPoint.getSignature().getName();
String methodInvokeLog = buildMethodInvokeLog(joinPoint);
try {
Object result = joinPoint.proceed();
log.error(String.format("%s => fail", methodInvokeLog), e);
Cat.logEvent(className, method);
} catch (Throwable e) {
log.error("{} => fail", methodInvokeLog, e);
throw e;
}
}
/**
* 获取切点名
*
* @param joinPoint
* @return
*/
private String buildMethodInvokeLog(ProceedingJoinPoint joinPoint) {
StringBuilder sb = new StringBuilder();
String className = joinPoint.getTarget().getClass().getSimpleName();
String method = joinPoint.getSignature().getName();
sb.append(className + "." + method + "(");
Object[] args = joinPoint.getArgs();
for (Object arg : args) {
sb.append(arg);
}
sb.append(")");
return sb.toString();
}
}
设置方法注解:
@OperateLog
@Override
public boolean insertOperateLog(ConsoleOperateLogBean consoleOperateLogBean) {
return operateLogDao.insertOperateLogDao(consoleOperateLogBean);
}
打印结果:
PermissionServiceImpl.judgePermission(PermissionSearchCondition(accessPointId=70, sourceTypeEnum=ACCESSPLATFORM, misId=dainan, permission=view))=>true