通过注解和切面实现日志记录

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 通过注解和切面实现日志记录
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documentedpublic@interfaceAutoLog {
booleaninLog() defaulttrue;
booleanoutLog() defaulttrue;
AutoLogLevelEnumlevel() defaultNONE;
}
/*** projectName micro-util* package com.open.util.handler.aspect* classname  AutoLogAspect* <p>* description* </p>** @author <a href="mailto:joshualwork@163.com">joshua_liu</a>* @date 2021/7/2 18:00*/@Slf4j@Aspect@Component@Order(Ordered.LOWEST_PRECEDENCE)
publicclassAutoLogAspect {
@Value("${open.advice.log.enabled:true}")
privatebooleanlogEnabled;
@Value("${open.advice.log.logging.level:DEBUG}")
privateAutoLogLevelEnumloggingLevel;
@Pointcut("@annotation(com.com.open.util.entity.annotation.AutoLog)")
privatevoidallRequestMethod() {
    }
@Before("allRequestMethod()")
publicvoiddoBefore(JoinPointjoinPoint) {
if (!logEnabled) {
return;
        }
AutoLogautoLog=getAutoLog(joinPoint);
if (!autoLog.inLog()) {
return;
        }
AutoLogLevelEnumlogLevel=Objects.equals(autoLog.level(), NONE) ?loggingLevel : autoLog.level();
ServletRequestAttributesattributes= (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
Optional.ofNullable(attributes).ifPresent(attribute-> {
HttpServletRequestrequest=attribute.getRequest();
request.getRequestURI();
request.getRemoteAddr();
logManage(logLevel, "Request uri [{}],remote addr {}", request.getRequestURI(), request.getRemoteAddr());
        });
Object[] args=joinPoint.getArgs();
MethodSignaturemethodSignature= (MethodSignature) joinPoint.getSignature();
Methodmethod=methodSignature.getMethod();
logManage(logLevel, "In log method:[{}],args [{}]", method, args);
    }
@AfterReturning(value="allRequestMethod()", returning="returnValue")
publicvoiddoAfter(JoinPointjoinPoint, ObjectreturnValue) {
if (!logEnabled) {
return;
        }
AutoLogaroundLogger=getAutoLog(joinPoint);
if (!aroundLogger.outLog()) {
return;
        }
AutoLogLevelEnumlogLevel=Objects.equals(aroundLogger.level(), NONE) ?loggingLevel : aroundLogger.level();
MethodSignaturemethodSignature= (MethodSignature) joinPoint.getSignature();
Methodmethod=methodSignature.getMethod();
logManage(logLevel, "Out log method:[{}],return [{}]", method, returnValue);
    }
privateAutoLoggetAutoLog(JoinPointpoint) {
MethodSignaturemethodSignature= (MethodSignature) point.getSignature();
Methodmethod=methodSignature.getMethod();
AutoLogresult=method.getAnnotation(AutoLog.class);
if (Objects.isNull(result)) {
returnmethod.getDeclaringClass().getAnnotation(AutoLog.class);
        }
returnresult;
    }
privatevoidlogManage(AutoLogLevelEnumlevel, Stringmarket, Object... args) {
switch (level) {
caseWARN:
log.warn(market, args);
break;
caseDEBUG:
log.debug(market, args);
break;
default:
log.info(market, args);
        }
    }
}
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
JSON Java 测试技术
为了理直气壮怼回去,写了一个日志切面输出接口出入参数
我们在日常排查问题过程中知道,入参传错是导致接口调用失败的常见原因之一。特别是提供给第三方调用的**回调接口和openAPI接口**,由于无法保证第三方开发人员的水平,经常问题不断,反反复复找你问为啥掉不通,甚至吐槽写的“啥玩意接口”,这时候你肯定一脸懵逼,怒火中烧,想展开撕逼甩锅大战,但是对方有可能是甲方金主爸爸并且你没有第一时间掌握证据证明证是对方调用的问题,你只能忍着问他是如何调接口的,卑微请求他把传参发过来看看。。。为了扭转局势,挺直腰杆怼回去:能不能靠谱点?今天我们就来讲讲系统服务中如何优雅地实现统一打印接口API参数日志,方便服务端开发快速甩锅还能拿出证据!!!
185 0
为了理直气壮怼回去,写了一个日志切面输出接口出入参数
|
Java
Java切面日志LogsAspect
Java切面日志LogsAspect
385 2
|
3月前
|
SQL 监控 Java
在IDEA 、springboot中使用切面aop实现日志信息的记录到数据库
这篇文章介绍了如何在IDEA和Spring Boot中使用AOP技术实现日志信息的记录到数据库的详细步骤和代码示例。
在IDEA 、springboot中使用切面aop实现日志信息的记录到数据库
|
17天前
|
JSON Java 数据库
SpringBoot项目使用AOP及自定义注解保存操作日志
SpringBoot项目使用AOP及自定义注解保存操作日志
33 1
|
5月前
|
监控 Java Spring
自定义注解+AOP切面日志+源码
自定义注解+AOP切面日志+源码
43 1
|
4月前
|
前端开发 Java
支付系统20-----支付宝支付-----统一收单下单并支付页面接口----定义controller,跨域注解,统一收单下单并支付页面接口的创建,打印日志的注解
支付系统20-----支付宝支付-----统一收单下单并支付页面接口----定义controller,跨域注解,统一收单下单并支付页面接口的创建,打印日志的注解
|
5月前
|
Java Spring 容器
Spring5系列学习文章分享---第六篇(框架新功能系列+整合日志+ @Nullable注解 + JUnit5整合)
Spring5系列学习文章分享---第六篇(框架新功能系列+整合日志+ @Nullable注解 + JUnit5整合)
38 0
|
6月前
|
Java
java使用AOP切面获取请求日志并记录
java使用AOP切面获取请求日志并记录
|
6月前
|
存储 消息中间件 Java
Java多线程实战-异步操作日志记录解决方案(AOP+注解+多线程)
Java多线程实战-异步操作日志记录解决方案(AOP+注解+多线程)
|
6月前
|
NoSQL Redis
RedisUtils+切面日志
redis常用工具类,包括string/hash/list/set基本类型操作,redisson发布订阅功能