java spring aop 日志管理_spring AOP自定义注解方式实现日志管理

1 packagecom.gcx.annotation;2

3 importjava.lang.reflect.Method;4 importjava.util.Date;5 importjava.util.UUID;6

7 importjavax.annotation.Resource;8 importjavax.servlet.http.HttpServletRequest;9 importjavax.servlet.http.HttpSession;10

11 importorg.aspectj.lang.JoinPoint;12 importorg.aspectj.lang.ProceedingJoinPoint;13 importorg.aspectj.lang.annotation.After;14 importorg.aspectj.lang.annotation.AfterReturning;15 importorg.aspectj.lang.annotation.AfterThrowing;16 importorg.aspectj.lang.annotation.Around;17 importorg.aspectj.lang.annotation.Aspect;18 importorg.aspectj.lang.annotation.Before;19 importorg.aspectj.lang.annotation.Pointcut;20 importorg.slf4j.Logger;21 importorg.slf4j.LoggerFactory;22 importorg.springframework.stereotype.Component;23

24 importcom.gcx.entity.SystemLog;25 importcom.gcx.entity.User;26 importcom.gcx.service.SystemLogService;27 importcom.gcx.util.JsonUtil;28

29 /**

30 *@author杨建31 * @E-mail: email32 *@version创建时间:2015-10-19 下午4:29:0533 * @desc 切点类34 */

35

36 @Aspect37 @Component38 public classSystemLogAspect {39

40 //注入Service用于把日志保存数据库

41 @Resource //这里我用resource注解,一般用的是@Autowired,他们的区别如有时间我会在后面的博客中来写

42 privateSystemLogService systemLogService;43

44 private static final Logger logger = LoggerFactory.getLogger(SystemLogAspect. class);45

46 //Controller层切点

47 @Pointcut("execution (* com.gcx.controller..*.*(..))")48 public voidcontrollerAspect() {49 }50

51 /**

52 * 前置通知 用于拦截Controller层记录用户的操作53 *54 *@paramjoinPoint 切点55 */

56 @Before("controllerAspect()")57 public voiddoBefore(JoinPoint joinPoint) {58 System.out.println("==========执行controller前置通知===============");59 if(logger.isInfoEnabled()){60 logger.info("before " +joinPoint);61 }62 }63

64 //配置controller环绕通知,使用在方法aspect()上注册的切入点

65 @Around("controllerAspect()")66 public voidaround(JoinPoint joinPoint){67 System.out.println("==========开始执行controller环绕通知===============");68 long start =System.currentTimeMillis();69 try{70 ((ProceedingJoinPoint) joinPoint).proceed();71 long end =System.currentTimeMillis();72 if(logger.isInfoEnabled()){73 logger.info("around " + joinPoint + "\tUse time : " + (end - start) + " ms!");74 }75 System.out.println("==========结束执行controller环绕通知===============");76 } catch(Throwable e) {77 long end =System.currentTimeMillis();78 if(logger.isInfoEnabled()){79 logger.info("around " + joinPoint + "\tUse time : " + (end - start) + " ms with exception : " +e.getMessage());80 }81 }82 }83

84 /**

85 * 后置通知 用于拦截Controller层记录用户的操作86 *87 *@paramjoinPoint 切点88 */

89 @After("controllerAspect()")90 public voidafter(JoinPoint joinPoint) {91

92 /*HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();93 HttpSession session = request.getSession();*/

94 //读取session中的用户95 //User user = (User) session.getAttribute("user");96 //请求的IP97 //String ip = request.getRemoteAddr();

98 User user = newUser();99 user.setId(1);100 user.setName("张三");101 String ip = "127.0.0.1";102 try{103

104 String targetName =joinPoint.getTarget().getClass().getName();105 String methodName =joinPoint.getSignature().getName();106 Object[] arguments =joinPoint.getArgs();107 Class targetClass =Class.forName(targetName);108 Method[] methods =targetClass.getMethods();109 String operationType = "";110 String operationName = "";111 for(Method method : methods) {112 if(method.getName().equals(methodName)) {113 Class[] clazzs =method.getParameterTypes();114 if (clazzs.length ==arguments.length) {115 operationType = method.getAnnotation(Log.class).operationType();116 operationName = method.getAnnotation(Log.class).operationName();117 break;118 }119 }120 }121 //*========控制台输出=========*//

122 System.out.println("=====controller后置通知开始=====");123 System.out.println("请求方法:" + (joinPoint.getTarget().getClass().getName() + "." + joinPoint.getSignature().getName() + "()")+"."+operationType);124 System.out.println("方法描述:" +operationName);125 System.out.println("请求人:" +user.getName());126 System.out.println("请求IP:" +ip);127 //*========数据库日志=========*//

128 SystemLog log = newSystemLog();129 log.setId(UUID.randomUUID().toString());130 log.setDescription(operationName);131 log.setMethod((joinPoint.getTarget().getClass().getName() + "." + joinPoint.getSignature().getName() + "()")+"."+operationType);132 log.setLogType((long)0);133 log.setRequestIp(ip);134 log.setExceptioncode( null);135 log.setExceptionDetail( null);136 log.setParams( null);137 log.setCreateBy(user.getName());138 log.setCreateDate(newDate());139 //保存数据库

140 systemLogService.insert(log);141 System.out.println("=====controller后置通知结束=====");142 } catch(Exception e) {143 //记录本地异常日志

144 logger.error("==后置通知异常==");145 logger.error("异常信息:{}", e.getMessage());146 }147 }148

149 //配置后置返回通知,使用在方法aspect()上注册的切入点

150 @AfterReturning("controllerAspect()")151 public voidafterReturn(JoinPoint joinPoint){152 System.out.println("=====执行controller后置返回通知=====");153 if(logger.isInfoEnabled()){154 logger.info("afterReturn " +joinPoint);155 }156 }157

158 /**

159 * 异常通知 用于拦截记录异常日志160 *161 *@paramjoinPoint162 *@parame163 */

164 @AfterThrowing(pointcut = "controllerAspect()", throwing="e")165 public voiddoAfterThrowing(JoinPoint joinPoint, Throwable e) {166 /*HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();167 HttpSession session = request.getSession();168 //读取session中的用户169 User user = (User) session.getAttribute(WebConstants.CURRENT_USER);170 //获取请求ip171 String ip = request.getRemoteAddr();*/

172 //获取用户请求方法的参数并序列化为JSON格式字符串

173

174 User user = newUser();175 user.setId(1);176 user.setName("张三");177 String ip = "127.0.0.1";178

179 String params = "";180 if (joinPoint.getArgs() != null && joinPoint.getArgs().length > 0) {181 for ( int i = 0; i < joinPoint.getArgs().length; i++) {182 params += JsonUtil.getJsonStr(joinPoint.getArgs()[i]) + ";";183 }184 }185 try{186

187 String targetName =joinPoint.getTarget().getClass().getName();188 String methodName =joinPoint.getSignature().getName();189 Object[] arguments =joinPoint.getArgs();190 Class targetClass =Class.forName(targetName);191 Method[] methods =targetClass.getMethods();192 String operationType = "";193 String operationName = "";194 for(Method method : methods) {195 if(method.getName().equals(methodName)) {196 Class[] clazzs =method.getParameterTypes();197 if (clazzs.length ==arguments.length) {198 operationType = method.getAnnotation(Log.class).operationType();199 operationName = method.getAnnotation(Log.class).operationName();200 break;201 }202 }203 }204 /*========控制台输出=========*/

205 System.out.println("=====异常通知开始=====");206 System.out.println("异常代码:" +e.getClass().getName());207 System.out.println("异常信息:" +e.getMessage());208 System.out.println("异常方法:" + (joinPoint.getTarget().getClass().getName() + "." + joinPoint.getSignature().getName() + "()")+"."+operationType);209 System.out.println("方法描述:" +operationName);210 System.out.println("请求人:" +user.getName());211 System.out.println("请求IP:" +ip);212 System.out.println("请求参数:" +params);213 /*==========数据库日志=========*/

214 SystemLog log = newSystemLog();215 log.setId(UUID.randomUUID().toString());216 log.setDescription(operationName);217 log.setExceptioncode(e.getClass().getName());218 log.setLogType((long)1);219 log.setExceptionDetail(e.getMessage());220 log.setMethod((joinPoint.getTarget().getClass().getName() + "." + joinPoint.getSignature().getName() + "()"));221 log.setParams(params);222 log.setCreateBy(user.getName());223 log.setCreateDate(newDate());224 log.setRequestIp(ip);225 //保存数据库

226 systemLogService.insert(log);227 System.out.println("=====异常通知结束=====");228 } catch(Exception ex) {229 //记录本地异常日志

230 logger.error("==异常通知异常==");231 logger.error("异常信息:{}", ex.getMessage());232 }233 /*==========记录本地异常日志==========*/

234 logger.error("异常方法:{}异常代码:{}异常信息:{}参数:{}", joinPoint.getTarget().getClass().getName() +joinPoint.getSignature().getName(), e.getClass().getName(), e.getMessage(), params);235

236 }237

238 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值