aspectj 做日志(二)

前面方案有个问题:异常日志无法跟异常信息在前台显示兼容(异常信息没法在前台显示出来)

最后为了显示他,不得不这样做:

/**
  * 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已经保存),这样 就保存了日志不会两条,而且有状态

猜你喜欢

转载自cainiao1923.iteye.com/blog/2338589