您的位置:首页 > 编程语言 > Java开发

通过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();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: