输入,输出参数 日志监控!
一.注解类
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<>();
}
}
}
输入,输出参数 日志监控!相关推荐
- 输入参数_MyBatis中的输入/输出参数
MyBatis的输入/输出参数 输入参数 MyBatis中的Dao映射配置中的parameter属性表示输入参数类型,它对应Dao接口方法的参数类型有三种: 基本数据类型:如int.char等 < ...
- 【Grasshopper基础6】输入/输出参数可变的电池 / 如何让电池支持参数增加和减少
相信大家一定在Grasshopper中见过输入或者输出参数可以自由变化的电池,例如,笔者常用的电池"Entwine"就可以在电池的输入端添加一个参数或者减少参数,用来支持更多的电池 ...
- 【Grasshopper进阶】强制Grasshopper电池输入/输出参数数据结构扁平化 (i.e. Flatten/拍平/展开…)
我们都知道,Grasshopper中一个很重要的概念就是数据结构,把数据输入到电池某个端口时,根据数据的结构的不同(列表/数据树),电池对数据会做出不同的响应.这也是为什么在我们在Grasshoppe ...
- 在asp中怎么调用带输出参数的存储过程
这是我写的存储过程 CREATE proc hz @count2 bigint output, @minsl varchar, @maxsl varchar as create table #tmp( ...
- Linux系统命令与网络、磁盘参数和日志监控
C/C++Linux服务器开发/后台架构师知识体系整理 C/C++Linux服务器开发/后台架构师视频学习地址 Linux服务器开发/后台架构师学习群:960994558 1 基础命令和工具 grep ...
- Linux系统与网络、磁盘参数和日志监控等命令详解二
创作人QQ:851301776,邮箱:lfr890207@163.com, 欢迎大家一起技术交流,本博客主要是自己学习的心得体会,只为每天进步一点点! 个人座右铭: 1.没有横空出世,只要厚积一定发. ...
- 【Java 虚拟机原理】垃圾回收算法 ( 设置 JVM 命令参数输出 GC 日志 | GC 日志输出示例 | GC 日志分析 )
文章目录 一.设置 JVM 命令参数输出 GC 日志 二.GC 日志示例 三.GC 日志分析 一.设置 JVM 命令参数输出 GC 日志 在 IntelliJ IDEA 的启动参数中设置 -XX:+P ...
- 05.MyBtais两种取值符号以及输入参数和输出参数
输入参数:parameterType 两种取值符号的异同 1.类型为简单类型(8个基本类型+string) 不同点: a.#{任意值},${value} 其中的标识符只能是value b. #{}自动 ...
- 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的值原来 ...
最新文章
- menudiv.php,在div PHP之外返回的短代码函数
- html哪个属性不会脱离文档流,html 在不给高的时候使用float为什么下面的文档会脱离文档流...
- android 在xml文件中引用自定义View
- apache默认网站
- 批量插入以及数据存在重复就进行更新操作
- 信息学奥赛一本通(1135:配对碱基链)
- LeetCode946-验证栈序列
- 14、DNS正反向解析、主从复制、子域授权、区域转发 学习笔记
- ExcelToHtmlTable转换算法:将Excel转换成Html表格并展示(项目源码+详细注释+项目截图)...
- git clone 失败_鲜为人知的Git功能——Git Worktree工作树
- Java并发编程之美系列汇总
- sqlyog简单入门使用
- java ognl表达式_OGNL表达式
- 从0到1实现Web端H.265播放器:视频解码篇
- PDG格式转换PDF格式的方法
- 三星手机双微信设置方法,三星手机如何双开微信
- 华为手机非华为电脑NFC一碰传使用
- 战网服务器组件,架设自己的战网服务器
- 推荐一个好看的极简主义博客网站程序-liveblog
- 声源定位matlab模拟,毕业论文-基于MATLAB的声源定位系统.doc