直接上干货。
第二步:AOP编写日志实现类
第一步:编写自定义注解
@Target({ElementType. METHOD})
@Retention(RetentionPolicy.RUNTIME )
@Documented
public @interface JpfLog {
String moduleName(); //模块名称
String logType(); //日志类别
String desc() default "无描述信息" ;//
}
@Aspect
@Component
public class LogAspect {
@Autowired
private JFLogService jFLogService;
//标注该方法体为后置通知,当目标方法执行成功后执行该方法体
@AfterReturning("within(com.xxx.*.web..*) && @annotation(rl)")
public void insertLogSuccess(JoinPoint jp, JpfLog rl){
String moduleName = rl.moduleName() ;
String signature = jp.getSignature().toString(); //获取目标方法签名
String methodName = signature.substring(signature.lastIndexOf("." )+1, signature.indexOf("("));
JFLog jFLog = new JFLog();
jFLog.setId(CodeHelper. createUUID());
jFLog.setModuleName(moduleName);
jFLog.setMethodName(methodName);
jFLog.setExceptionContent( "");
jFLog.setLogType(rl.logType());
HttpServletRequest request=ContextHolderUtils. getRequest();
String broswer=BrowserUtils. checkBrowse(request);
jFLog.setBroswer(broswer);
jFLog.setOperateTime( new Date());
jFLog.setUser(ResourceUtil. getSessionUserName());
String ip = oConvertUtils. getIpAddrByRequest(request);
//如果访问路径为localhost,则获得的ip值为“0:0:0:0:0:0:0:1”
if( "0:0:0:0:0:0:0:1".equals(ip)){
ip = "127.0.0.1";
}
jFLog.setIp(ip);
jFLog.setFlag(StringConstant. SUCCESS);
jFLog.setRemark(rl.desc());
jFLogService.saveLog(jFLog);
}
//标注该方法体为异常通知,当目标方法出现异常时,执行该方法体
@AfterThrowing(pointcut= "within(com.xxx.*.web..*) && @annotation(rl)", throwing="ex")
public void insertLog(JoinPoint jp, JpfLog rl, CRUDException ex){
String moduleName = rl.moduleName() ;
String signature = jp.getSignature().toString(); //获取目标方法签名
String methodName = signature.substring(signature.lastIndexOf("." )+1, signature.indexOf("("));
JFLog jFLog = new JFLog();
jFLog.setId(CodeHelper. createUUID());
jFLog.setModuleName(moduleName);
jFLog.setMethodName(methodName);
jFLog.setExceptionContent(ex.getMessage());
jFLog.setLogType(rl.logType());
HttpServletRequest request=ContextHolderUtils. getRequest();
String broswer=BrowserUtils. checkBrowse(request);
jFLog.setBroswer(broswer);
jFLog.setOperateTime( new Date());
jFLog.setUser(ResourceUtil. getSessionUserName());
String ip = oConvertUtils. getIpAddrByRequest(request);
//如果访问路径为localhost,则获得的ip值为“0:0:0:0:0:0:0:1”
if( "0:0:0:0:0:0:0:1".equals(ip)){
ip = "127.0.0.1";
}
jFLog.setIp(ip);
jFLog.setFlag(StringConstant. ERROR);
jFLog.setRemark(rl.desc());
jFLogService.saveLog(jFLog);
}
}
注:
@AfterReturning为注解方法体成功执行后,执行的方法。
@AfterThrowing为注解方法体抛出
CRUDException
异常时执行的方法。
JoinPoint jp参数可以获得注解方法体的相关值,包括类名、方法名、参数等信息。
JpfLog
rl参数为自定义注解的类,可以获得自定义注解的值。
第三步:Spring mvc配置文件
<!-- 启用@AspectJ支持,从而可以实现通过注解方式将通知编织到非公共方法中 -->
<aop:aspectj-autoproxy />
第四步:自定义注解的使用
/**
* 保存新增的人员
* @param modelMap
* @param user
* @return
* @throws CRUDException
* @throws Exception
*/
@JpfLog(moduleName="人员",logType=StringConstant. Log_Type_INSERT,desc= "")
@RequestMapping(value = "/saveByAdd")
public ModelAndView saveUserByAdd(ModelMap modelMap, User user) throws CRUDException {
userService.saveUser(user);
return new ModelAndView(StringConstant. ACTION_DONE, modelMap);
}