前面方案有个问题:异常日志无法跟异常信息在前台显示兼容(异常信息没法在前台显示出来)
最后为了显示他,不得不这样做:
/** * controller日志注解,入口日志 * @author wj * */ @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD}) public @interface ControllerLogAnnotation { //模块名 String moduleName(); //操作内容 String option(); }
/** * service日志注解,异常日志 * @author wj * */ @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD}) public @interface ServiceLogAnnotation { String action(); }
@After(value = "controllerlogAspect() && @annotation(annotation) &&args(object,..) ", argNames = "") public void doAfter(JoinPoint joinPoint, ControllerLogAnnotation annotation, Object object) { HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()) .getRequest(); try { // String title = getAnnotationValue(joinPoint); String title = getAnnotationValue(annotation); saveLog(request, title); } catch (Exception e) { e.printStackTrace(); // 记录本地异常日志 logger.error("==异常通知异常=="); logger.error("异常信息:{}", e.getMessage()); } }
@AfterThrowing(value = "servicelogAspect() && @annotation(annotation) &&args(..) " , throwing = "e") public void doAfterThrowing(JoinPoint joinPoint, ServiceLogAnnotation annotation, Exception e) { HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()) .getRequest(); try { String title = getAnnotationValue(annotation); saveLog(request, title, e); } catch (Exception ex) { // 记录本地异常日志 logger.error("==异常通知异常=="); logger.error("异常信息:{}", ex.getMessage()); } }
使用:
controller--
/** * 新建一个用户 * @throws Exception */ @RequestMapping(value="saveUser") @ControllerLogAnnotation(moduleName="用户管理",option="新建用户") public void saveUser(User data,String[] funidvalue,HttpServletResponse response) { Json json = new Json(); try { service.saveUser(data,funidvalue); json.setSuccess(true); json.setMsg("保存成功"); } catch (Exception e) {//service :回滚、记录异常日志 // TODO Auto-generated catch block e.printStackTrace(); json.setSuccess(false); json.setMsg(e.getMessage()); logger.error(e.getMessage()); } writeJson(response,json); }
service----
@ServiceLogAnnotation(action="保存用户") public void saveUser(User data,String[] funidvalue) throws Exception{ if (data != null) { User u = userDao.findByUserid(data.getUserId());//查询出的用户会回滚? if (u != null) { throw new Exception("新建用户失败,用户名已存在!"); } else { entryptPassword(data); data.setStatus(Constants.UserStatusEnum.Active.getIndex());//默认激活状态 userDao.save(data); } } }
这样就是,分为入口日志和异常日志。入口日志肯定有,不管有无异常(这样有个问题,异常的时候会有两条日志)。
可以这样解决:在controller层,可以对返回值进行改造,JSON,在@AfterReturning里拿到返回值,再判断返回值,成功则保存日志,失败不保存(@AfterThrowing已经保存),这样 就保存了日志不会两条,而且有状态