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注解内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论