============= 后端_记录日志 ============= 1 创建日志注解 /ysdblog-api/src/main/java/com/weihome/ysdblog/common/aop/LogAnnotation.java: @Target({ElementType.METHOD}) // 方法注解 @Retention(RetentionPolicy.RUNTIME) @Documented public @interface LogAnnotation { String module() default ""; String operation() default ""; } 2 创建日志切面 /ysdblog-api/src/main/java/com/weihome/ysdblog/common/aop/LogAspect.java: @Component @Aspect @Slf4j public class LogAspect { // LogAnnotation注解加在哪个方法上,哪个方法就是切点 @Pointcut("@annotation(com.weihome.ysdblog.common.aop.LogAnnotation)") public void pointcut() {} // 环绕通知,在切点方法执行之前和之后执行增强操作 @Around("pointcut()") public Object advice(ProceedingJoinPoint joinPoint) throws Throwable { // 开始时间 long beginTime = System.currentTimeMillis(); // 执行切点 Object result = joinPoint.proceed(); // 计算耗时 long elapsedTime = System.currentTimeMillis() - beginTime; // 记录日志 wlog(joinPoint, elapsedTime); // 返回结果 return result; } private void wlog(ProceedingJoinPoint joinPoint, long elapsedTime) { log.info("---------------- YSDBLOG ----------------"); // 模块和操作 MethodSignature signature = (MethodSignature) joinPoint.getSignature(); Method method = signature.getMethod(); LogAnnotation annotation = method.getAnnotation(LogAnnotation.class); log.info("Module: {}", annotation.module()); log.info("Operation: {}", annotation.operation()); // 类名和方法名 String className = joinPoint.getTarget().getClass().getName(); String methodName =signature.getName(); log.info("Method: {}", className + "." + methodName + "()"); // 方法参数 Object[] args = joinPoint.getArgs(); log.info("Arguments: {}", JSON.toJSONString(args[0])); // 请求源IP HttpServletRequest request = HttpContextUtils.getHttpServletRequest(); log.info("IP: {}", IPUtils.getIpAddr(request)); // 方法耗时 log.info("Elapsed Time: {} ms", elapsedTime); log.info("-----------------------------------------"); } } 3 添加日志注解 /ysdblog-api/src/main/java/com/weihome/ysdblog/controller/ArticleController.java: ... public class ArticleController { ... @LogAnnotation(module = "文章", operation = "分页查询文章列表") public Result list(...) { ... } ... } 4 运行测试 Postman POST localhost:8888/article/list Body { "page": "1", "pageSize": "10" } ----------------------------------- ... 后端日志: ---------------- YSDBLOG ---------------- Module: 文章 Operation: 分页查询文章列表 Method: com.weihome.ysdblog.controller.ArticleController.list() Arguments: {"page":1,"pageSize":10} IP: 0:0:0:0:0:0:0:1 Elapsed time: 406 ms -----------------------------------------