java web日志记录之spring aop实现方式
来源:互联网 发布:linux查找文件路径命令 编辑:程序博客网 时间:2024/06/03 07:25
实现思路:spring aop切入到bean,在需要写日志的方法加入注解AuditLog,如果没有注解的方法则不记录日志。
注解类
@Target({ElementType.PARAMETER, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface AuditLog { String description() default "";//操作内容 StoreLogType logType() default StoreLogType.All;//操作类型}
spring aop切入类
@Aspect@Componentpublic class StoreLogCut {private static final Logger logger = LoggerFactory.getLogger(StoreLogCut.class);private static final String storeLogJsonParams = "storeLogJsonParams";//切入Controller请求参数为json类型需要将请求对象赋予该名称的属性,以便获取请求参数private StoreLogService storeLogService;/** * Controller层切入点 */@Pointcut("execution(public * com.cd.store.controller.*.*(..))")public void controllerAspect() {}/** * 后置返回通知 * * @param joinpoint * @param returnValue * @throws Throwable */@AfterReturning(value = "controllerAspect()", returning = "returnValue")public void after(JoinPoint joinpoint, Object returnValue) throws Throwable {writeLog(joinpoint, returnValue);}/** * 异常返回通知 * * @param joinpoint * @param errorMsg */@AfterThrowing(value = "controllerAspect()", throwing = "errorMsg")public void afterThrowException(JoinPoint joinpoint, Exception errorMsg) {writeLog(joinpoint, errorMsg);}/** * 记录日志 * * @param joinpoint * @param obj */private void writeLog(JoinPoint joinpoint, Object obj) {try {HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();StoreLogDescDto storeLogDescDto = getControllerMethodDescription(joinpoint);String action = storeLogDescDto.getAction();// 如果加了日志注解类则写入日志到数据库if (StringUtils.isNotBlank(action)) {int result = StoreLogResultType.success.getType();String returnMsg = "";if (obj instanceof Exception) {// 异常通知result = StoreLogResultType.Error.getType();returnMsg = ((Exception) obj).getMessage();} else {// 正常返回通知returnMsg = String.valueOf(obj);// 解析返回的数据(如返回false则为失败)result = getProcessResult(returnMsg);}String userName = getUserName(request);// 获取操作人String ip = Utils.getRequestIp(request);// 获取客户端ip地址String param = Utils.getParam(request,joinpoint,storeLogJsonParams);// 获取请求参数String requestUrl = String.valueOf(request.getRequestURL());storeLogService.insertLog(userName, ip, param, action, storeLogDescDto.getType(), result, returnMsg,requestUrl);}} catch (Exception e) {String errorMsg = new StringBuilder().append("write log to database error,").append(e.getMessage()).toString();logger.error(errorMsg);}}private int getProcessResult(String returnMsg) {if (StringUtils.isNotBlank(returnMsg) && "false".equalsIgnoreCase(returnMsg)) {return StoreLogResultType.Error.getType();}return StoreLogResultType.success.getType();}/** * 获取用户名 * * @param request * @return */private String getUserName(HttpServletRequest request) {HttpSession session = request.getSession();Object userNameObj = session.getAttribute(Constants.SS_ACCOUNT);String userName = "";if (userNameObj != null) {userName = (String) userNameObj;}return userName;}/** * 获取注解中对方法的描述信息 用于Controller层注解 * * @param joinPoint * 切点 * @return 方法描述 * @throws Exception */private StoreLogDescDto getControllerMethodDescription(JoinPoint joinPoint) throws Exception {String targetName = joinPoint.getTarget().getClass().getName();String methodName = joinPoint.getSignature().getName();Object[] arguments = joinPoint.getArgs();Class targetClass = Class.forName(targetName);Method[] methods = targetClass.getMethods();StoreLogDescDto storeLogDescDto = new StoreLogDescDto();String description = "";for (Method method : methods) {if (method.getName().equals(methodName)) {Class[] clazzs = method.getParameterTypes();if (clazzs.length == arguments.length) {AuditLog storeLogAnnotation = method.getAnnotation(AuditLog.class);if (storeLogAnnotation != null) {description = storeLogAnnotation.description();int type = storeLogAnnotation.logType().getType();storeLogDescDto.setAction(description);storeLogDescDto.setType(type);break;}}}}return storeLogDescDto;}public StoreLogService getStoreLogService() {return storeLogService;}@Autowired@Requiredpublic void setStoreLogService(StoreLogService storeLogService) {this.storeLogService = storeLogService;}
阅读全文
0 1
- java web日志记录之spring aop实现方式
- Spring AOP实现日志记录
- Spring AOP实现日志记录
- Spring AOP 实现业务日志记录
- spring的AOP实现记录操作日志
- 采用Spring AOP实现日志记录
- Spring AOP 实现业务日志记录
- Spring AOP实现系统日志记录
- Spring AOP 实现业务日志记录
- Spring AOP 实现系统操作日志记录
- spring aop自定义注解实现日志记录
- Spring AOP实现系统日志记录
- Spring AOP 实现系统操作日志记录
- Spring Aop实现简单日志记录
- spring aop 实现系统日志的记录
- spring aop 实现操作日志记录
- Spring之AOP实现方式
- spring aop 日志记录
- 人群密度分析学习之路
- 已知两点坐标和半径求圆心坐标程序C++
- linux安装mongodb
- 三栏结构布局技巧
- 人群分析--ResnetCrowd: A Residual Deep Learning Architecture
- java web日志记录之spring aop实现方式
- 使用Qt Designer来设计界面
- 再说Runnable、Callable、Future、线程池
- Mac中NTFS格式文件的读写
- windows读写锁
- Babel 7步入门教程
- 房间安排
- Qt状态栏(statusbar)的使用
- etcd集群日常维护