通过spring aop记录日志信息(异常)
2018-02-03 20:55
459 查看
前言
在日常开发中,我们经常需要对接接口数据,日志记录用户操作,如果单纯的使用手动记录的话不仅会让代码看起来不美观还增加了很多的工作量。但是如果使用aop切面在不影响业务情况下进行日志访问记录的话就省事多了。代码
实体类Log.java@Data public class Log { private Integer id; private String username; private String operation; private String method; private String params; private String returnParams; private String error; private String ip; private Date createTime; }
LogApi.java注解类
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface LogApi { String value() default ""; }
自定义aop日志切入LogAspect.java
@Aspect @Component public class LogAspect { @Autowired private LogMapper logMapper; Log sysLog = new Log(); @Pointcut("@annotation(com.test.anonation.LogApi)") public void logPointCut() { } @Before("logPointCut()") public void saveSysLog(JoinPoint joinPoint) { MethodSignature signature = (MethodSignature) joinPoint.getSignature(); Method method = signature.getMethod(); LogApi syslog = method.getAnnotation(LogApi.class); if(syslog != null){ //注解上的描述 sysLog.setOperation(syslog.value()); } //请求的方法名 String className = joinPoint.getTarget().getClass().getName(); String methodName = signature.getName(); sysLog.setMethod(className + "." + methodName + "()"); System.out.println(sysLog.getMethod()); //请求的参数 Object[] args = joinPoint.getArgs(); String params = JSON.toJSONString(args); sysLog.setParams(params); HttpServletRequest request = HttpContextUtils.getHttpServletRequest(); sysLog.setIp(IPUtils.getIpAddr(request)); String username ="测试而已"; sysLog.setUsername(username); sysLog.setCreateTime(new Date()); //保存系统日志 } @AfterReturning(returning="rvt", pointcut="logPointCut()") public void AfterExec(JoinPoint joinPoint,Object rvt){ sysLog.setReturnParams(rvt==null?"":rvt.toString()); sysLog.setError(""); logMapper.insert(sysLog); sysLog=new Log(); } @AfterThrowing(pointcut = "logPointCut()",throwing="e") public void doException(JoinPoint jp,Throwable e){ if(e!=null){ Logger logger = LoggerFactory.getLogger(jp.getSignature().getClass()); logger.error(e.getMessage(),e); sysLog.setError("错误:"+e); logMapper.insert(sysLog); sysLog=new Log(); } } }
工具类IPUtils.java
public static String getIpAddr(HttpServletRequest request) { String ip = null; try { ip = request.getHeader("x-forwarded-for"); if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); } if (StringUtils.isEmpty(ip) || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); } if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_CLIENT_IP"); } if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_X_FORWARDED_FOR"); } if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } } catch (Exception e) { logger.error("IPUtils ERROR ", e); } return ip; }
request获取工具类HttpContextUtils.java
public static HttpServletRequest getHttpServletRequest() { return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); }
相关文章推荐
- spring aop 切面记录log4j日志 之around记录异常信息
- Spring AOP记录日志信息
- spring用aop记录异常日志
- 利用Spring AOP实现业务和异常日志记录
- Spring AOP 基于注解的AOP 实现 记录日志,异常捕获
- 通过SpringAOP获取request中所有参数,记录用户操作日志
- Spring使用aop将日志(包括异常信息)输入到日志文件
- SpringAOP注解方式记录操作日志(操作模块,操作功能,调用方法,主键信息等)支持多笔操作时记录
- Spring编程:通过Aspect实现AOP编程完成日志记录
- Spring AOP 自定义注解记录操作日志
- Spring aop Aspect实现Service或Controller日志记录
- Spring实践之AOP一异常处理和日志处理
- 使用Spring AOP使用注解记录用户操作日志
- Spring AOP实现系统日志记录
- 【代码全】使用SpringAOP编写日志记录(插入oracle数据库中)
- 从头认识Spring-1.8 怎样利用AOP记录日志?
- Spring AOP 实现系统操作日志记录
- springboot 自定义注解+AOP 实现日志记录
- Spring AOP 系统日志记录
- 【HAVENT原创】使用 Spring Boot 的 AOP 全局记录执行时间日志