当前位置: 代码网 > it编程>编程语言>Java > 日志模块自定义@SkipLogAspect注解跳过切面的操作方法

日志模块自定义@SkipLogAspect注解跳过切面的操作方法

2025年02月14日 Java 我要评论
1.增加原因因为如果参数是一些大对象,比如httpservletrequest request,在转化为json的时候就会导致oom,所以选择新增一个注解让用户自己灵活的决定是否添加日志切面2.com

1.增加原因

因为如果参数是一些大对象,比如httpservletrequest request,在转化为json的时候就会导致oom,所以选择新增一个注解让用户自己灵活的决定是否添加日志切面

2.common-log4j2-starter

1.目录结构

2.skiplogaspect.java 自定义注解

package cn.sunxiansheng.log4j2.annotation;
import java.lang.annotation.elementtype;
import java.lang.annotation.retention;
import java.lang.annotation.retentionpolicy;
import java.lang.annotation.target;
/**
 * description: 跳过日志切面的注解
 *
 * @author sun
 * @create 2025/1/24 18:08
 * @version 1.0
 */
@target({elementtype.method, elementtype.type}) // 可以标注在类或方法上
@retention(retentionpolicy.runtime) // 运行时生效
public @interface skiplogaspect {
}

3.logaspect.java

1.核心改动

2.完整代码

package cn.sunxiansheng.log4j2.aspectj;
import cn.sunxiansheng.log4j2.annotation.skiplogaspect;
import com.google.gson.gson;
import com.google.gson.gsonbuilder;
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 java.lang.reflect.method;
/**
 * 日志切面
 *
 * @author sunxiansheng
 */
@aspect
@slf4j
public class logaspect {
    private static final gson gson = new gsonbuilder()
            .setprettyprinting()
            .disablehtmlescaping()
            .create();
    private static final string ansi_reset = "\u001b[0m";
    private static final string ansi_cyan = "\u001b[92m";
    @pointcut("execution(public * *..controller..*(..)) || " +
            "execution(public * *..service..*(..))")
    public void applicationpackagepointcut() {
        // 切点定义
    }
    @around("applicationpackagepointcut()")
    public object logaround(proceedingjoinpoint joinpoint) throws throwable {
        // 获取目标类和方法
        methodsignature signature = (methodsignature) joinpoint.getsignature();
        method method = signature.getmethod();
        class<?> targetclass = joinpoint.gettarget().getclass();
        // 检查是否存在 @skiplogaspect 注解
        if (method.isannotationpresent(skiplogaspect.class) ||
                targetclass.isannotationpresent(skiplogaspect.class)) {
            // 直接执行目标方法,不记录日志
            return joinpoint.proceed();
        }
        // 正常记录日志逻辑
        string classname = signature.getdeclaringtypename();
        string methodname = signature.getname();
        object[] args = joinpoint.getargs();
        string requestparams = gson.tojson(args);
        log.info("==> 进入方法: {}.{}()", classname, methodname);
        log.info("参数:\n" + ansi_cyan + "{}" + ansi_reset, requestparams);
        long starttime = system.currenttimemillis();
        object result = joinpoint.proceed();
        long endtime = system.currenttimemillis();
        string response = gson.tojson(result);
        log.info("<== 退出方法: {}.{}() | 耗时: {} ms", classname, methodname, endtime - starttime);
        log.info("返回值:\n" + ansi_cyan + "{}" + ansi_reset, response);
        return result;
    }
}

3.common-log4j2-starter-demo

1.目录结构

2.tracecontroller.java 新增方法,测试跳过日志切面的注解

/**
 * 测试跳过日志切面的注解
 *
 * @param msg
 * @return
 */
@skiplogaspect
@requestmapping("/skiplogaspect")
public string skiplogaspect(string msg) {
    return "skip log aspect";
}

3.测试

到此这篇关于日志模块自定义@skiplogaspect注解跳过切面的文章就介绍到这了,更多相关日志模块自定义@skiplogaspect注解内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com