一.注解类
package com.djhu.followup.control.advice;

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

/**

  • @Author zw

  • @DATE 2019/6/5 9:22

  • @VERSION 1.0.0
    **/
    @Target({ElementType.METHOD,ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface ApiLog {
    public String value();

    public boolean persistence() default false;

}
二.切面
package com.djhu.followup.control.advice;

import com.djhu.followup.entity.dto.ResultResp;
import com.djhu.followup.service.log.IPersistenceLogService;
import com.djhu.followup.service.log.RestLog;
import com.google.gson.Gson;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.time.DateFormatUtils;
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.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;

/**

  • @Author zw

  • @DATE 2019/6/5 9:21

  • @VERSION 1.0.0
    **/
    @Slf4j
    @Aspect
    @Component
    @EnableAspectJAutoProxy
    public class ApiLogAspect {

    @Autowired(required = false)
    private IPersistenceLogService persistenceLogService;

    private Gson gson = new Gson();

    @Pointcut("@annotation(com.djhu.followup.control.advice.ApiLog)")
    public void cutPoint(){
    }

    @Around(value=“cutPoint()&&@annotation(apiLog)”)
    public Object doAroundAdvice(ProceedingJoinPoint joinPoint,ApiLog apiLog) throws Throwable {
    try {
    long start = System.currentTimeMillis();
    if (apiLog == null){
    return joinPoint.proceed();
    }
    Object[] args = joinPoint.getArgs();
    Object logArgs = getLogArgs(args);
    log.info("{} 接口,接到的请求为 {}",apiLog.value(),gson.toJson(logArgs));
    Object obj = joinPoint.proceed();
    long end = System.currentTimeMillis();
    //如果返回值必须是Result
    if (apiLog.persistence()){
    if (persistenceLogService != null){
    RestLog restLog = buildResultLog(joinPoint,obj);
    restLog.setStartTime(start);
    restLog.setStrStartTime(DateFormatUtils.format(start,RestLog.FORMAT_PATTERN));
    restLog.setEndTime(end);
    restLog.setStrEndTime(DateFormatUtils.format(end,RestLog.FORMAT_PATTERN));
    persistenceLogService.log(restLog);
    }
    }

         if(obj != null && (obj instanceof ResultResp)){ResultResp result = (ResultResp) obj;String strLog = String.format("%s 接口,返回界面的结果为 %s,用时为 %s",apiLog.value(),gson.toJson(result),String.valueOf(end-start));log.info(strLog);return obj;}else{log.warn("Return value:"+obj.getClass().getName()+" is not instance of "+ResultResp.class.getName()+" save api log may be error");String strLog = String.format("%s 接口,返回界面的结果为 %s,用时为 %s",apiLog.value(),gson.toJson(obj),String.valueOf(end-start));log.info(strLog);return obj;}}catch (Throwable t){log.error("接口 {} 出现异常!!!",apiLog.value(),t);throw t;}finally {}
    

    }

    private RestLog buildResultLog(ProceedingJoinPoint joinPoint, Object obj) {
    RestLog restLog= new RestLog();
    try {
    restLog.setProcessClass(joinPoint.getTarget().getClass().getName());
    restLog.setParameters(joinPoint.getArgs());
    restLog.setProcessMethod(joinPoint.getSignature().toString());
    ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
    HttpServletRequest request = attributes.getRequest();
    String realIP = request.getHeader(“X-Real-IP”);
    if(StringUtils.isEmpty(realIP)){
    restLog.setRemoteAddr(realIP);
    }else{
    restLog.setRemoteAddr(request.getRemoteAddr());
    }
    restLog.setLocalAddr(request.getLocalAddr());
    restLog.setLocalPort(request.getLocalPort());
    restLog.setUri(request.getRequestURI());
    }catch (Exception e){
    }
    return restLog;
    }

    private Object getLogArgs(Object[] args) {
    List list = new ArrayList<>();
    for (Object arg:args){
    if (arg instanceof ServletRequest){
    continue;
    }else {
    list.add(arg);
    }
    }
    if (CollectionUtils.isNotEmpty(list)){
    if (list.size() == 1){
    return list.get(0);
    }else {
    return list;
    }
    }else {
    return new ArrayList<>();
    }
    }
    }

输入,输出参数 日志监控!相关推荐

  1. 输入参数_MyBatis中的输入/输出参数

    MyBatis的输入/输出参数 输入参数 MyBatis中的Dao映射配置中的parameter属性表示输入参数类型,它对应Dao接口方法的参数类型有三种: 基本数据类型:如int.char等 < ...

  2. 【Grasshopper基础6】输入/输出参数可变的电池 / 如何让电池支持参数增加和减少

    相信大家一定在Grasshopper中见过输入或者输出参数可以自由变化的电池,例如,笔者常用的电池"Entwine"就可以在电池的输入端添加一个参数或者减少参数,用来支持更多的电池 ...

  3. 【Grasshopper进阶】强制Grasshopper电池输入/输出参数数据结构扁平化 (i.e. Flatten/拍平/展开…)

    我们都知道,Grasshopper中一个很重要的概念就是数据结构,把数据输入到电池某个端口时,根据数据的结构的不同(列表/数据树),电池对数据会做出不同的响应.这也是为什么在我们在Grasshoppe ...

  4. 在asp中怎么调用带输出参数的存储过程

    这是我写的存储过程 CREATE proc hz @count2 bigint output, @minsl varchar, @maxsl varchar as create table #tmp( ...

  5. Linux系统命令与网络、磁盘参数和日志监控

    C/C++Linux服务器开发/后台架构师知识体系整理 C/C++Linux服务器开发/后台架构师视频学习地址 Linux服务器开发/后台架构师学习群:960994558 1 基础命令和工具 grep ...

  6. Linux系统与网络、磁盘参数和日志监控等命令详解二

    创作人QQ:851301776,邮箱:lfr890207@163.com, 欢迎大家一起技术交流,本博客主要是自己学习的心得体会,只为每天进步一点点! 个人座右铭: 1.没有横空出世,只要厚积一定发. ...

  7. 【Java 虚拟机原理】垃圾回收算法 ( 设置 JVM 命令参数输出 GC 日志 | GC 日志输出示例 | GC 日志分析 )

    文章目录 一.设置 JVM 命令参数输出 GC 日志 二.GC 日志示例 三.GC 日志分析 一.设置 JVM 命令参数输出 GC 日志 在 IntelliJ IDEA 的启动参数中设置 -XX:+P ...

  8. 05.MyBtais两种取值符号以及输入参数和输出参数

    输入参数:parameterType 两种取值符号的异同 1.类型为简单类型(8个基本类型+string) 不同点: a.#{任意值},${value} 其中的标识符只能是value b. #{}自动 ...

  9. M文件-函数的参数-传值还是传址/检查输入参数的个数/传递参数/输出参数

    1   传值的方式      传址的方式区别 function f=ad(a,b) f=a+b: b=b+10; 命令行: a=2;b=5; f=ad(a,b) f= 7 b 5 并没有改变b的值原来 ...

最新文章

  1. menudiv.php,在div PHP之外返回的短代码函数
  2. html哪个属性不会脱离文档流,html 在不给高的时候使用float为什么下面的文档会脱离文档流...
  3. android 在xml文件中引用自定义View
  4. apache默认网站
  5. 批量插入以及数据存在重复就进行更新操作
  6. 信息学奥赛一本通(1135:配对碱基链)
  7. LeetCode946-验证栈序列
  8. 14、DNS正反向解析、主从复制、子域授权、区域转发 学习笔记
  9. ExcelToHtmlTable转换算法:将Excel转换成Html表格并展示(项目源码+详细注释+项目截图)...
  10. git clone 失败_鲜为人知的Git功能——Git Worktree工作树
  11. Java并发编程之美系列汇总
  12. sqlyog简单入门使用
  13. java ognl表达式_OGNL表达式
  14. 从0到1实现Web端H.265播放器:视频解码篇
  15. PDG格式转换PDF格式的方法
  16. 三星手机双微信设置方法,三星手机如何双开微信
  17. 华为手机非华为电脑NFC一碰传使用
  18. 战网服务器组件,架设自己的战网服务器
  19. 推荐一个好看的极简主义博客网站程序-liveblog
  20. 声源定位matlab模拟,毕业论文-基于MATLAB的声源定位系统.doc

热门文章

  1. glibc源码编译安装
  2. c语言实现简单的加减乘除运算---@颜麓
  3. k8s开启临时容器ephemeral进行debug调试
  4. JAVASE阿里云盘
  5. Spring框架四AOP
  6. js for循环执行顺序
  7. dSploit使用教程
  8. 怎么在eclipse里复制项目
  9. ThinkPadX201在Ubuntu下安装GOBI2000 3G无线网卡驱动
  10. 2021制定计划待办事项清单的记事便签