SSM项目 添加统一日志支持 #私藏项目实操分享#

2021年11月24日 阅读数:3
这篇文章主要向大家介绍SSM项目 添加统一日志支持 #私藏项目实操分享#,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

第一步:在springmvc.xml中添加cglib设置

<!-- 强制使用cglib代理,若是不设置,将默认使用jdk的代理,可是jdk的代理是基于接口的 -->
<aop:aspectj-autoproxy proxy-target-class="true" />

第二步:日志切面

@Slf4j
@Component
@Aspect
public class LogInterceptor {
    private String logStr = "";

    //用来作环绕通知的方法能够第一个参数定义为org.aspectj.lang.ProceedingJoinPoint类型
    @Around("execution(* com.hc.controller.*.*(..))")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        //获取RequestAttributes
        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
        //从获取RequestAttributes中获取HttpServletRequest的信息
        HttpServletRequest request = (HttpServletRequest)
                requestAttributes.resolveReference(RequestAttributes.REFERENCE_REQUEST);
        //获取请求用户的IP地址
        String ipAddr = getRemoteHost(request);
        //获取用户请求的具体路径
        String url = request.getRequestURL().toString();
        log.info("************  请求IP:{},请求URL:{}", ipAddr, url);

        //获取类名
        String className = joinPoint.getTarget().getClass().getName();
        //获取方法名
        String methodName = joinPoint.getSignature().getName();

        //至关于前置通知
        logStr ="************  "+ className + "类的" + methodName + "方法开始执行  ************";
        log.info(logStr);

        Object[] obj = joinPoint.getArgs();//获取目标方法的参数信息
        log.info("************  请求的参数为:" + Arrays.toString(obj));
//        if (obj.length > 0) {
//            Enumeration<String> enumeration = request.getParameterNames();
//            Map<String, String> parameterMap = new HashMap();
//            while (enumeration.hasMoreElements()) {
//                String parameter = enumeration.nextElement();
//                parameterMap.put(parameter, request.getParameter(parameter));
//            }
//            ObjectMapper om = new ObjectMapper();
//            String str = om.writeValueAsString(parameterMap);
//            log.info("请求的参数为:" + str);
//        }
        Object result = null;
        try {
            result = joinPoint.proceed();
            //至关于后置通知
            logStr = "************  "+className + "." + methodName + "()方法正常执行结束...";
            log.info(logStr);
        } catch (Throwable e) {
            //至关于异常抛出后通知
            StackTraceElement stackTraceElement = e.getStackTrace()[e.getStackTrace().length - 1];
            Object[] args = joinPoint.getArgs();

            log.error("----------------------------------------------------------------------------------");
            log.error("********* 执行{}类的{}()方法的{}行", className, methodName, stackTraceElement.getLineNumber());
            log.error("********* 异常信息为:{}  ", e.fillInStackTrace().toString());
            log.error("********* 参数信息为:{}  ", args);
            throw e;
        } finally {
            //至关于最终通知
            logStr = "************  "+ className + "类的" + methodName + "方法执行结束,结果是:{}  ************";
            log.info(logStr, result);
        }
        return result;
    }

    /**
     * 获取目标主机的ip
     *
     * @param request
     * @return
     */
    private String getRemoteHost(HttpServletRequest request) {
        String ip = request.getHeader("x-forwarded-for");
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("WL-Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
        }
        return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : ip;
    }

}

第三步:请求控制器测试