SpringBoot配置使用Spring AOP日志记录

Posted 东子z

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot配置使用Spring AOP日志记录相关的知识,希望对你有一定的参考价值。

1、引入pom

        <!--springBoot的aop-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
        <!--日志打印使用到 @Slf4j注解  方便又简单-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>    

关于@Slf4j IDEA无法显示import的问题

https://www.cnblogs.com/dzcici/p/12877551.html

目录结构

 

 

2、使用注解方式进行注明

 

 

LogAuditAspect.class
package com.dbcoding.mall.cms.aspect;

import com.dbcoding.mall.cms.aspect.annotation.SystemLogs;
import com.dbcoding.mall.cms.service.SellChannelAddressService;
import com.dbcoding.mall.utils.RequestUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.logging.log4j.util.PropertiesUtil;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

/**
 * @ClassName: AAA
 * @Description: TODO
 * @Author: Stephen.Zhang
 * @CreateDate: 2020-05-15 09:37
 * @Version: 1.0
 **/
@Aspect
@Component
@Slf4j
public class LogAuditAspect {
    private String LOG_AUDIT_MESSAGE = "log_audit.properties";
    @Autowired
    private SellChannelAddressService sellService;

    @Pointcut("@annotation(com.dbcoding.mall.cms.aspect.annotation.SystemLogs)")
    public void aspect() {
    }

    @After("aspect()")
    public void doAfter(JoinPoint joinPoint) throws Exception {
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
                .getRequest();
        Map<String, Object> map = getControllerMethodDescription(joinPoint);
        String key = (String) map.get("key");
        //String description = PropertiesUtil.getProperties(this.LOG_AUDIT_MESSAGE, key);
        log.info(key);//方法名备注  
        log.info(RequestUtil.getRealIp(request));//IP
        log.info(request.getRequestURI());//请求具体URL
        log.info(request.getMethod());//请求方法 GET...
    }

    @AfterThrowing(pointcut = "aspect()", throwing = "e")
    public void doAfterThrowing(JoinPoint joinPoint, Throwable e) {
        log.info("Enter the abnormal log...");
        try {
            HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
                    .getRequest();
            Map<String, Object> map = getControllerMethodDescription(joinPoint);
            String key = (String) map.get("key");
            //String description = PropertiesUtil.getProperties(this.LOG_AUDIT_MESSAGE, key);
            log.info(key);//注解value值
            log.info(RequestUtil.getRealIp(request));//IP
            log.info(request.getRequestURI());//请求具体URL
            log.info(request.getMethod());//请求方法 GET...
            log.info(e.getMessage());//异常消息
        } catch (Exception e1) {
            e1.printStackTrace();
        }
    }

    private Map<String, Object> getControllerMethodDescription(JoinPoint joinPoint) throws Exception {
        Map<String, Object> map = new HashMap();
        String targetName = joinPoint.getTarget().getClass().getName();
        String methodName = joinPoint.getSignature().getName();
        Object[] arguments = joinPoint.getArgs();
        Class targetClass = Class.forName(targetName);
        Method[] methods = targetClass.getMethods();
        for (Method method : methods) {
            if (method.getName().equals(methodName)) {
                Class[] clazzs = method.getParameterTypes();
                if (clazzs.length == arguments.length) {
                    map.put("key", ((SystemLogs) method.getAnnotation(SystemLogs.class)).key());
                    break;
                }
            }
        }
        return map;
    }
}
SystemLogs
package com.dbcoding.mall.cms.aspect.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.METHOD})
public @interface SystemLogs {
    String key() default "";
}

RequestUtil.class

package com.dbcoding.mall.utils;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;

import javax.servlet.http.HttpServletRequest;
import java.util.Enumeration;
import java.util.regex.Matcher;

/**
 * @ClassName: AAA
 * @Description: TODO
 * @Author: Stephen.Zhang
 * @CreateDate: 2020-05-15 10:18
 * @Version: 1.0
 **/
@Slf4j
public class RequestUtil {
    public static int getPageid(HttpServletRequest request, String name) {
        int pageid = NumberUtils.toInt(request.getParameter(name));
        if (pageid <= 0) {
            return 1;
        }
        return pageid;
    }

    public static String getUrl(HttpServletRequest request) {
        StringBuffer sb = request.getRequestURL();
        String queryString = request.getQueryString();
        if (StringUtils.isNotEmpty(queryString)) {
            sb.append(\'?\').append(queryString);
        }
        return sb.toString();
    }

    public static String getReferer(HttpServletRequest request) {
        return request.getHeader("referer");
    }

    public static String getRequestUri(HttpServletRequest request) {
        return request.getRequestURI();
    }

    private static final java.util.regex.Pattern IS_LICIT_IP_PATTERN = java.util.regex.Pattern.compile("^[0-9]{1,3}\\\\.[0-9]{1,3}\\\\.[0-9]{1,3}\\\\.[0-9]{1,3}$");

    public static boolean isLicitIp(final String ip) {
        if (StringUtils.isEmpty(ip)) {
            return false;
        }

        Matcher m = IS_LICIT_IP_PATTERN.matcher(ip);
        if (!m.find()) {
            return false;
        }
        return true;
    }

    public static boolean isSsl(HttpServletRequest request) {
        boolean isSsl = "true".equalsIgnoreCase(request.getHeader("ssl"));
        return isSsl;
    }

    public static String getProtocol(HttpServletRequest request) {
        boolean isSsl = RequestUtil.isSsl(request);
        String protocol;
        if (isSsl) {
            protocol = "https";
        } else {
            protocol = "http";
        }
        return protocol;
    }

    public static String getRedirect(HttpServletRequest request, String url) {
        if (StringUtils.isEmpty(url)) {
            log.error("url parameters can not be null.");
            throw new NullPointerException("url parameters can not be null.");
        }
        if (url.startsWith("http")) {
            return url;
        }
        boolean isSsl = RequestUtil.isSsl(request);
        if (!isSsl) {
            return url;
        }
        if (!url.startsWith("/")) {
            String path = request.getServletPath();
            int index = path.lastIndexOf(\'/\');
            if (index != -1) {
                url = path.substring(0, index + 1) + url;
            }
        }
        String serverName = request.getServerName();

        return "https://" + serverName + url;
    }

    @SuppressWarnings("unchecked")
    public static void printHeaders(HttpServletRequest request) {
        Enumeration<String> e = request.getHeaderNames();
        while (e.hasMoreElements()) {
            String name = e.nextElement();
            String value = request.getHeader(name);
            log.info(name + ":" + value);
        }
    }

    /**
     * 获取真实客户端IP
     *
     * @param request
     * @return
     */
    public static String getRealIp(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();
        }

        int index = ip.lastIndexOf(\',\');
        if(index <= 0) {
            index = ip.length();
        }
        String lastip = ip.substring(0, index).trim();

        if ("127.0.0.1".equals(lastip) || !isLicitIp(lastip)) {
            return request.getRemoteAddr();
        }

        return lastip;
    }
}

3、使用

 

 

 

 

 

以上是关于SpringBoot配置使用Spring AOP日志记录的主要内容,如果未能解决你的问题,请参考以下文章

springboot 集成aop模块

SpringBoot默认开启AOP,采用Cglib代理方式?(Spring AOP快速入门)

SpringBoot默认开启AOP,采用Cglib代理方式?(Spring AOP快速入门)

SpringBoot默认开启AOP,采用Cglib代理方式?(Spring AOP快速入门)

spring aop配置出错 帮忙检查

springboot 怎么看日志