当前位置:网站首页 > 产品管理 > 正文

springboot aop日志管理(springboot日志管理界面)



@Component @Slf4j @Aspect public class LogHandlerAspect { private static final String QUOTES = """; / * 匹配所有带有@LogHandler注解的方法 * @author YiLiChenTu * @date 2021/8/26 18:44 * @return * @throws **/ @Pointcut("execution(@com.xxx.common.annotation.LogHandler * *(..)) ") public void resultLog(){} @Around(value = "resultLog()") public Object around(ProceedingJoinPoint point) throws Throwable { MethodSignature signature = (MethodSignature) point.getSignature(); //获取切入点所在的方法 Method method = signature.getMethod(); LogHandler logHandler = method.getAnnotation(LogHandler.class); if (logHandler == null){ return point.proceed(); } //获取请求的类名 String className = point.getTarget().getClass().getName(); //获取请求的方法名 String methodName = method.getName(); //入参日志  before(point,signature,method,className,methodName,logHandler); // 执行方法 Object result = point.proceed(); boolean fileOrStream = isFileOrStream(result); Assert.isTrue(!fileOrStream,"LogHandler====>> LoggerHandler日志注解不能作用于流或文件上"); //后置日志  afterLog(result,className,methodName,logHandler); return result; } / * 接口入参打印 * @author YiLiChenTu * @date 2021/8/30 15:24 * @param joinPoint * @param signature * @param method * @param className * @param methodName * @param logHandler * @return * @throws **/ public void before(JoinPoint joinPoint,MethodSignature signature,Method method,String className,String methodName,LogHandler logHandler) { try{ Object[] args = joinPoint.getArgs(); String[] parameterNames = signature.getParameterNames(); Annotation[][] annotationArr = method.getParameterAnnotations(); for (int i = 0; i < parameterNames.length; i++){ Annotation[] annotations = annotationArr[i]; LoggerOut loggerOut = null; for (Annotation annotation : annotations) { if (annotation instanceof LoggerOut){ loggerOut = (LoggerOut) annotation; break; } } if (loggerOut == null){ //未携带注解的参数不处理 continue; } String paramName = parameterNames[i]; Object arg = args[i]; if (arg == null){ printLog(logHandler,"LogHandler-param-log====>> className:{},methodName:{},param:{},value:{}", className,methodName, paramName, null); continue; } boolean fileOrStream = isFileOrStream(arg); Assert.isTrue(!fileOrStream,"LogHandler-param-log====>> LoggerHandler日志注解不能作用于流或文件上"); boolean flag = isBaseTypeOrString(arg); if (flag){ //8中基本数据类型的包装类型,或者String类型,直接打印 printLog(logHandler,"LogHandler-param-log====>> className:{},methodName:{},param:{},value:{}", className,methodName, paramName,arg); }else if (arg instanceof Collection){ //入参为集合类型,判断集合中是否为对象类型 Collection 
 
   
    list = (Collection 
 
   
   ) arg; int size = list.size(); if (size == 0 || isBaseTypeOrString(list.toArray()[0])){ printLog(logHandler,"LogHandler-param-log====>> className:{},methodName:{},param:{},value:{}", className,methodName, paramName,JSON.toJSONString(arg)); }else { log.warn("LogHandler-param-log====>> className:{},methodName:{},入参:{} 为集合类型,不打印", className,methodName,paramName); } }else if (arg instanceof Object[]){ Object[] arr = (Object[]) arg; if (arr.length == 0 || isBaseTypeOrString(arr[0])){ printLog(logHandler,"LogHandler-param-log====>> className:{},methodName:{},param:{},value:{}", className,methodName, paramName,JSON.toJSONString(arg)); }else { log.warn("LogHandler-param-log====>> className:{},methodName:{},param:{} 为对象数组,不打印", className, methodName,paramName); } }else if (arg instanceof Map){ log.warn("LogHandler-param-log====>> className:{},methodName:{},入参:{} 为集合类型,不打印", className,methodName,paramName); }else { //入参为对象,反射获取对象字段值 String builder = paramToString(arg); printLog(logHandler,"LogHandler-param-log====>> className:{},methodName:{},param:{},value:{}", className,methodName, paramName,builder); } } }catch (Exception e){ log.error("LogHandler打印入参异常",e); } } / * 返回结果日志输出 * @author YiLiChenTu * @date 2021/8/30 15:24 * @param result * @param className * @param methodName * @param logHandler * @return * @throws **/ private void afterLog(Object result,String className,String methodName,LogHandler logHandler){ try { if (result instanceof Ret){ Ret 
 
   
    ret = (Ret 
 
   
   ) result; Object data = ret.getData(); logOut(data, logHandler, className, methodName); }else { logOut(result, logHandler, className, methodName); } }catch (Exception e){ log.error("日志切面后置处理异常",e); } } / * 获取需要打印的字段转换字符串 * @author YiLiChenTu * @date 2021/8/30 10:31 * @param result * @return * @throws **/ private String paramToString(Object result) { StringBuilder builder = new StringBuilder(); builder.append("{"); List 
 
   
   
    
    
   fields = 
  
    
     getAllFields(result); Reflect reflect = 
  
    
     Reflect.on(result); Map 
  
    
    
      fieldValueMap = 
      reflect.fields();  
     for ( 
     int i = 0; i < fields.size(); i++ 
     ) { Field field = 
      fields.get(i); LoggerOut loggerOut = field.getAnnotation(LoggerOut. 
     class 
     );  
     if (loggerOut == 
     null 
     ){  
     continue 
     ; } String fieldName = 
      field.getName(); Object value = 
      fieldValueMap.get(fieldName).get();  
     if 
      (isFileOrStream(value)){  
     throw 
     new XXXException("不要把日志注解标注在流或文件类型的字段上" 
     ); }  
     if (value 
     instanceof Collection || value 
     instanceof Map || value 
     instanceof 
      Object[]){  
     continue 
     ; } builder.append(QUOTES); builder.append(fieldName); builder.append(QUOTES); builder.append(":" 
     ); builder.append(JSON.toJSONString(value)); builder.append(Symbol.COMMA); }  
     if (builder.length() > 1 
     ){ builder.deleteCharAt(builder.length()-1 
     ); } builder.append("}" 
     );  
     return 
      builder.toString(); }  
     private List 
      
       getAllFields(Object result){ List 
      
        fields = 
       new ArrayList<> 
       (); Class 
        clazz = 
        result.getClass();  
       // 
       向上循环 遍历父类 
       for (; clazz != Object. 
       class; clazz = 
        clazz.getSuperclass()) { Field[] field = 
        clazz.getDeclaredFields();  
       for 
        (Field f : field) { f.setAccessible( 
       true 
       ); fields.add(f); } }  
       return 
        fields; }  
       / 
        * 日志输出 *  
       @author 
        YiLiChenTu * @date 2021/8/30 10:31 *  
       @param 
        result *  
       @param 
        methodLog *  
       @param 
        className *  
       @param 
        methodName *  
       @return 
        *  
       @throws 
        * 
       */ 
       private 
       void 
        logOut(Object result, LogHandler methodLog, String className, String methodName) {  
       if (result == 
       null 
       ){ printLog(methodLog,"LogHandler-result-log====>> className:{},methodName:{},result:{}" 
       , className,methodName,  
       null 
       );  
       return 
       ; }  
       if 
        (isBaseTypeOrString(result)){  
       // 
       基本数据类型或者字符串,直接输出日志 printLog(methodLog,"LogHandler-result-log====>> className:{},methodName:{},result:{}" 
       , className, methodName, JSON.toJSONString(result));  
       return 
       ; }  
       if (result 
       instanceof 
        Map){ log.warn("LogHandler-result-log====>> className:{},methodName:{},返回结果为集合类型,不打印" 
       , className, methodName);  
       return 
       ; }  
       if (result 
       instanceof 
        Collection){ Collection 
        list = (Collection 
        
       ) result;  
       int size = 
        list.size();  
       if (size == 0 || isBaseTypeOrString(list.toArray()[0 
       ])){ printLog(methodLog,"LogHandler-result-log====>> className:{},methodName:{},result:{}" 
       , className, methodName, JSON.toJSONString(result)); } 
       else 
        { log.warn("LogHandler-result-log====>> className:{},methodName:{},返回结果为集合类型,不打印" 
       , className, methodName); }  
       return 
       ; }  
       if (result 
       instanceof 
        Object[]){ Object[] arr = 
        (Object[]) result;  
       if (arr.length == 0 || isBaseTypeOrString(arr[0 
       ])){ printLog(methodLog,"LogHandler-result-log====>> className:{},methodName:{},result:{}" 
       , className, methodName, JSON.toJSONString(result)); } 
       else 
        { log.warn("LogHandler-result-log====>> className:{},methodName:{},返回结果为对象数组,不打印" 
       , className, methodName); }  
       return 
       ; }  
       // 
       入参为对象,反射获取对象字段值 String builder = 
        paramToString(result); printLog(methodLog,"LogHandler-result-log====>> className:{},methodName:{},result:{}" 
       , className,methodName, builder); }  
       / 
        * 判断是否为文件或者流类型 *  
       @author 
        YiLiChenTu * @date 2021/8/30 10:32 *  
       @param 
        obj *  
       @return 
        *  
       @throws 
        * 
       */ 
       private 
       boolean 
        isFileOrStream(Object obj){  
       return obj 
       instanceof 
        InputStreamSource || obj 
       instanceof 
        InputStreamSource[] || obj 
       instanceof 
        File || obj 
       instanceof 
        File[] || obj 
       instanceof 
        InputStream || obj 
       instanceof 
        InputStream[]; }  
       / 
        * 判断是否基本数据类型或者字符串类型 *  
       @author 
        YiLiChenTu * @date 2021/8/30 10:32 *  
       @param 
        obj *  
       @return 
        *  
       @throws 
        * 
       */ 
       private 
       boolean 
        isBaseTypeOrString(Object obj){  
       return obj 
       instanceof 
        Byte || obj 
       instanceof 
        Short || obj 
       instanceof 
        Integer || obj 
       instanceof 
        Long || obj 
       instanceof 
        Character || obj 
       instanceof 
        Float || obj 
       instanceof 
        Double || obj 
       instanceof 
        Boolean || obj 
       instanceof 
        String; }  
       / 
        * 根据日志级别,打印不同级别的日志 *  
       @author 
        YiLiChenTu * @date 2021/8/30 10:32 *  
       @param 
        logHandler *  
       @param 
        formatStr *  
       @param 
        formats *  
       @return 
        *  
       @throws 
        * 
       */ 
       private 
       void 
        printLog(LogHandler logHandler, String formatStr, Object... formats){  
       if (logHandler.value() == 
        LoggerLevel.INFO){ log.info(formatStr,formats); } 
       else 
       if (logHandler.value() == 
        LoggerLevel.DEBUG){ log.debug(formatStr,formats); } 
       else 
       if (logHandler.value() == 
        LoggerLevel.WARN){ log.warn(formatStr,formats); } 
       else 
       if (logHandler.value() == 
        LoggerLevel.TRACE){ log.warn(formatStr,formats); } } } 
       
      
     
 
   
   
到此这篇springboot aop日志管理(springboot日志管理界面)的文章就介绍到这了,更多相关内容请继续浏览下面的相关 推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • 日志管理的作用(日志管理的作用不包括)2026-04-29 18:54:06
  • git服务器管理工具(git 文件服务器)2026-04-29 18:54:06
  • 怎么打开任务管理器快捷键win7(如何打开任务管理器windows7)2026-04-29 18:54:06
  • 日志管理系统功能页面(日志管理系统功能页面在哪)2026-04-29 18:54:06
  • 文件管理(文件管理系统)2026-04-29 18:54:06
  • 任务管理器怎么快捷打开控制面板(任务管理器怎么快捷打开控制面板设置)2026-04-29 18:54:06
  • 产品经理入门基础知识(产品经理入门基础知识有哪些)2026-04-29 18:54:06
  • 产品经理职业证书(产品经理专业证书)2026-04-29 18:54:06
  • 产品经理入门教程pdf(产品经理入门课程百度云)2026-04-29 18:54:06
  • 文件管理系统在操作系统中提供了(操作系统中,文件管理的主要作用)2026-04-29 18:54:06
  • 全屏图片