spring aop 实现系统日志的记录

从今天开始记录每一天工作过程中学习的新知识吧!
代码也是参考的别人写的,侵删哦

spring aop

@Aspect
@Component
public class WebRequestLogAspect {

private static Logger logger = Logger.getLogger(WebRequestLogAspect.class);
private static SimpleDateFormat sdf1=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

@Autowired
private OperatorLogService operatorLogService;

@Autowired
private UserService userService;

@Pointcut("execution(* com.xxx.xxxxx.xxxxx.xxxx.xxxxx..*.*(..))") //切点
public void webRequestLog(){}

@Before("webRequestLog()") 
public void doBefore(JoinPoint joinPoint){
    try {   
    OperatorLog operatorLog = new OperatorLog();
    ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
    HttpServletRequest request = attributes.getRequest();
    String method = request.getMethod();
    //判断是否是post方法,如果是,则记录到日志表中
    if("POST".equals(method)){
        long beginTime = System.currentTimeMillis();  
        String beanName = joinPoint.getSignature().getDeclaringTypeName(); //方法所在的类名
        String methodName = joinPoint.getSignature().getName();//方法名
        String uri = request.getRequestURI(); //接口名
        String url = request.getRequestURL().toString(); //url
        String remoteAddr = getIpAddr(request); //ip地址
        String sessionId = request.getSession().getId();
        Integer  uid = (Integer) request.getSession().getAttribute("uid"); //用户id
        if(uid != null){
                User user = userService.getById(uid);
            if(user !=null){
                operatorLog.setUser_account(user.getAccount());
                operatorLog.setUserId(user.getId());
            }
        }


        operatorLog.setBeanName(beanName);
        operatorLog.setMethodName(methodName);
        operatorLog.setRemoteAddr(remoteAddr);
        operatorLog.setSessionId(sessionId);
        operatorLog.setUri(uri);
        operatorLog.setUrl(url);
        Date date = new Date(beginTime);
        String requestTime = sdf1.format(date);
        operatorLog.setRequestTime(requestTime);
        operatorLog.setStatus(CommonStatus.IS_ACTIVE.getStatus());
        operatorLog = operatorLogService.save(operatorLog);
        //tlocal.set(operatorLog);
    }
    } catch (Exception e) {
        logger.info("操作请求日志记录失败");
    }
}

/*@AfterReturning(returning="result",pointcut = "webRequestLog()")
public void doAfterReturning(Object result){
}
*/

private String getIpAddr(HttpServletRequest request){     
    String ip = request.getHeader("x-forwarded-for");
    if(ip==null || ip.length()==0 || "unknowm".equalsIgnoreCase(ip)){
        ip = request.getHeader("Proxy-Client-IP");
    }
    if(ip==null || ip.length()==0 || "unknowm".equalsIgnoreCase(ip)){
        ip = request.getHeader("WL-Proxy-Client-IP");
    }
    if(ip==null || ip.length()==0 || "unknowm".equalsIgnoreCase(ip)){
        ip = request.getRemoteAddr();
    }
    return ip;
}

}

spring boot 配置方法:
在application文件中添加:
spring.aop.auto=true
spring.aop.proxy-target-class=false

在pom.xml文件中添加:

org.springframework.boot
spring-boot-starter-aop

这个方法记录操作日志还是很方便的,操作人在什么时间进行了什么操作一目了然,定位问题很方便,便于找到BUG,还是挺有意思的

猜你喜欢

转载自blog.csdn.net/shanger_1216/article/details/77979317