springBoot使用注解Aop实现日志模块

我们在日常业务操作中需要记录很多日志,可以在我们需要的方法中对日志进行保存操作,但是对业务代码入侵性大。使用切面针对控制类进行处理灵活度不高,因此我们可以使用自定义注解来针对方法进行日志记录

1.注解

package com.infra.open.api.log;

import java.lang.annotation.*;

/**
 * 日志注解
 *
 * @Author : cgy
 * @Date : 2022/6/5
 */
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LogAnnotation {
    /**
     * 接口名称
     *
     * @return
     */
    String interfaceName() default "";

    /**
     * 备注
     *
     * @return
     */
    String remark() default "";
}

2.切面类

package com.infra.open.api.log;

import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;

/**
 * @Author : cgy
 * @Date : 2022/6/5
 */
@Slf4j
@Aspect
@Component
public class LogRecordAspect {

    @Pointcut("@annotation(com.infra.open.api.log.LogAnnotation)")
    public void pt() {
    }

    /**
     * 处理
     */
    @Around("pt()")
    public Object log(ProceedingJoinPoint joinPoint) throws Throwable {
        //开始时间
        Long sTime = System.currentTimeMillis();
        //执行方法
        Object result = joinPoint.proceed();
        //结束时间
        Long eTime = System.currentTimeMillis();
        //处理日志
        handleLog(joinPoint, sTime, eTime);
        return result;
    }

    /**
     * 记录日志
     *
     * @param joinPoint
     * @param sTime
     * @param eTime
     */
    private void handleLog(ProceedingJoinPoint joinPoint, Long sTime, Long eTime) {
        //获取方法上面的注解
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Method method = signature.getMethod();
        LogAnnotation annotation = method.getAnnotation(LogAnnotation.class);
        //注解中的赋值
        String interfaceName = annotation.interfaceName();
        String remark = annotation.remark();

        System.out.println("注解中的值" + interfaceName + remark);

        //获取请求的方法地址
        String name = method.getName();
        System.out.println("name1" + name);
        String name1 = signature.getName();
        System.out.println("name2" + name1);
        String name2 = joinPoint.getTarget().getClass().getName();
        System.out.println("name3" + name2);

        //获取参数
        Object[] args = joinPoint.getArgs();
        System.out.println("args" + JSON.toJSONString(args[0]));

        //获取请求的ip地址
        HttpServletRequest request = HttpContextUtil.getHttpServletRequest();
        String ipAddr = IpUtils.getIpAddr(request);
        System.out.println("ip" + ipAddr);
    }
}

3.工具类

package com.infra.open.api.log;

import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;

/**
 * @Author : cgy
 * @Date : 2022/6/5
 */
public class HttpContextUtil {
    public static HttpServletRequest getHttpServletRequest() {
        return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
    }
}
package com.infra.open.api.log;

/**
 * @Author : cgy
 * @Date : 2022/6/5
 */

import javax.servlet.http.HttpServletRequest;
import java.net.InetAddress;
import java.net.UnknownHostException;

public class IpUtils {
    private static final String UNKNOWN = "unknown";
    private static final String LOCALHOST = "127.0.0.1";
    private static final String SEPARATOR = ",";

    public static String getIpAddr(HttpServletRequest request) {
        System.out.println(request);
        String ipAddress;
        try {
            ipAddress = request.getHeader("x-forwarded-for");
            if (ipAddress == null || ipAddress.length() == 0 || UNKNOWN.equalsIgnoreCase(ipAddress)) {
                ipAddress = request.getHeader("Proxy-Client-IP");
            }
            if (ipAddress == null || ipAddress.length() == 0 || UNKNOWN.equalsIgnoreCase(ipAddress)) {
                ipAddress = request.getHeader("WL-Proxy-Client-IP");
            }
            if (ipAddress == null || ipAddress.length() == 0 || UNKNOWN.equalsIgnoreCase(ipAddress)) {
                ipAddress = request.getRemoteAddr();
                if (LOCALHOST.equals(ipAddress)) {
                    InetAddress inet = null;
                    try {
                        inet = InetAddress.getLocalHost();
                    } catch (UnknownHostException e) {
                        e.printStackTrace();
                    }
                    ipAddress = inet.getHostAddress();
                }
            }
            // 对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割
            // "***.***.***.***".length()
            if (ipAddress != null && ipAddress.length() > 15) {
                if (ipAddress.indexOf(SEPARATOR) > 0) {
                    ipAddress = ipAddress.substring(0, ipAddress.indexOf(","));
                }
            }
        } catch (Exception e) {
            ipAddress = "";
        }
        return ipAddress;
    }
}

Original: https://www.cnblogs.com/cgy1995/p/16343883.html
Author: spiderMan1-1
Title: springBoot使用注解Aop实现日志模块

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/711788/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球