首页 > 其他分享 >springboot加切面日志

springboot加切面日志

时间:2023-06-25 18:13:06浏览次数:51  
标签:lang springboot joinPoint 切面 org import 日志 annotation Log

package org.rest.util;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Log {

    /**
     * log 说明
     *
     * @return
     */
    String value() default "";

    /**
     * 是否忽略,比如类上面加的有注解,类中某一个方法不想打印可以设置该属性为 true
     *
     * @return
     */
    boolean ignore() default false;

}
package org.rest.util;

import java.lang.reflect.Method;

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 com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;

import lombok.extern.slf4j.Slf4j;

@Aspect
@Component
@Slf4j
public class LogAspect {

    private String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";

    @Pointcut("@annotation(org.rest.util.Log)")
    public void serviceLog() {
    }

    @Around("serviceLog()")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Method method = signature.getMethod();
        Class<?> targetClass = method.getDeclaringClass();

        StringBuilder classAndMethod = new StringBuilder();

        Log classAnnotation = targetClass.getAnnotation(Log.class);
        Log methodAnnotation = method.getAnnotation(Log.class);

        if (classAnnotation != null) {
            if (classAnnotation.ignore()) {
                return joinPoint.proceed();
            }
            classAndMethod.append(classAnnotation.value()).append("-");
        }

        if (methodAnnotation != null) {
            if (methodAnnotation.ignore()) {
                return joinPoint.proceed();
            }
            classAndMethod.append(methodAnnotation.value());
        }

        String target = targetClass.getName() + "#" + method.getName();
        String params = JSONObject.toJSONStringWithDateFormat(joinPoint.getArgs(), DATE_TIME_PATTERN, SerializerFeature.WriteMapNullValue);

        log.info("{} 开始调用--> {} 参数:{}", classAndMethod.toString(), target, params);

        long start = System.currentTimeMillis();
        Object result = joinPoint.proceed();
        long timeConsuming = System.currentTimeMillis() - start;

        log.info("{} 调用结束<-- {} 返回值:{} 耗时:{}ms", classAndMethod.toString(), target, JSONObject.toJSONStringWithDateFormat(result, DATE_TIME_PATTERN, SerializerFeature.WriteMapNullValue), timeConsuming);
        return result;
    }

}
@Service
@Log("用户登录")
@Slf4j
public class UserServiceImpl implements UserService {

}

标签:lang,springboot,joinPoint,切面,org,import,日志,annotation,Log
From: https://www.cnblogs.com/lovedaodao/p/17503615.html

相关文章

  • 利用SpringBoot和javafx进行桌面开发
    原文合集地址如下,有需要的朋友可以关注本文地址合集地址众所周知,SpringBoot是一款强大的Javaweb开发程序,这得益于其构造了一个Spring容器,然后通过依赖注入和控制反转,维护起一套Java对象和实例的管理机制,方便开发者去使用。在web应用开发的应用中,Springboot在Java层应用非常广,同样的......
  • 利用SpringBoot和javafx进行桌面开发
    原文合集地址如下,有需要的朋友可以关注本文地址合集地址众所周知,SpringBoot是一款强大的Javaweb开发程序,这得益于其构造了一个Spring容器,然后通过依赖注入和控制反转,维护起一套Java对象和实例的管理机制,方便开发者去使用。在web应用开发的应用中,Springboot在Java层应用非常广,......
  • SpringBoot用@Async实现异步调用
    @Async的使用1、在启动类中加上注解@EnableAsync启用异步 2、在使用异步的方法上加上注解@Async,自己写一个线程池,指定线程池。不建议使用默认的线程池。 在线程池应用中,参考阿里巴巴java开发规范:线程池不允许使用Executors去创建,不允许使用系统默认的线程池,推荐通过T......
  • springboot~stateless4j实现状态机
    状态机,包括了状态和动作,某个状态下,只能执行某些动作,如果动作不匹配,状态是不会进行变更了,这样就保护了我们状态字段的准备性,不能随意改变,必须按着我们设计的规则进行状态的轮转。Stateless实现的状态机Stateless:Stateless是一个简单且易于使用的状态机库,它提供了基本的状态转换......
  • springboot里的@ConfigurationProperties注解介绍
    在SpringBoot中,@ConfigurationProperties注解用于将外部配置文件中的属性值绑定到Java类的字段或属性上。通过使用该注解,可以方便地将一组配置属性统一绑定到一个POJO类中,然后在应用程序中使用。以下是@ConfigurationProperties注解的主要特点和使用方式:绑......
  • kibana启动失败Kibana server is not ready yet,后台日志报错:NoShardAvailableActionEx
    kibana.log日志报错信息:,{"level":"error","message":"Actionfailedwith'no_shard_available_action_exception'.Retryingattempt8outof10in64seconds."},{"level":"error","message&qu......
  • springboot里的@PropertySource注解介绍
    在SpringBoot中,@PropertySource注解用于加载外部的属性源文件,将其作为配置文件来使用。该注解可以用于标记在Java类上,并指定要加载的属性源文件的位置。使用@PropertySource注解可以很方便地将外部的属性文件加载到Spring的环境中,并可以通过@Value注解或Environ......
  • 实际案例分析 - 根据应用程序日志的记录,反查出哪一行 ABAP 代码产生的这条日志试读版
    本文的写作动机来自笔者知识星球一个朋友的提问:调用bapi创建主数据的时候报错,没有未物料组分配特性参数文件,这个是什么原因?实际查看,特性文件已经生成了这个朋友提供的是应用程序日志(即ApplicationLog)里的截图。关于应用程序日志的详细用法,笔者之前的文章已经做过介绍。74.学会......
  • 容器日志收集与管理:让日志无处可逃
    本文将详细介绍Kubernetes里对容器日志的处理方式。首先需要明确,Kubernetes里对容器日志的处理方式都叫作cluster-level-logging,即这个日志处理系统与容器、Pod以及节点的生命周期都完全无关。这种设计当然是为了保证无论容器不工作、Pod被删除,甚至节点宕机,依然可以正常获取......
  • 【转】SpringBoot 线上服务假死,CPU 内存正常
    文章来源:blog.csdn.net/zhangcongyi420/article/details/1311395991、背景开发小伙伴都知道线上服务挂掉,基本都是因为cpu或者内存不足,出现GC频繁OOM之类的情况。本篇文章区别以上的情况给小伙伴们带来不一样的服务挂掉。 2、问题排查老规矩在集群环境中同一个服务......