spring Boot使用AOP统一处理Web请求日志记录
1.使用spring boot实现一个拦截器
1、引入依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>/**
* 拦截器:记录O2O调用接口记录
*/
@Aspect
@Component
public class O2oInterfaceInterceptor {
@Autowired
private SysCallInterfaceLogRepository sysCallInterfaceLogRepository;
@Autowired
private SysEmailService sysEmailService;
@Autowired
private SysPropertyService sysPropertyService;
private static Logger logger = LoggerFactory.getLogger(O2oInterfaceInterceptor.class);
/**
* 定义拦截规则:拦截com.ctop.wms.interfaces.ActivitiInterfaces包下面的所有类中,有@RequestMapping注解的方法。
*/
@Pointcut("execution(* com.ctop.wms.interfaces.ActivitiInterfaces.*(..)) and @annotation(org.springframework.web.bind.annotation.RequestMapping)")
public void controllerMethodPointcut() {}
@Around("controllerMethodPointcut()")
public Object controllerMethodPointcutInterceptor(ProceedingJoinPoint pjp) {
return Interceptor(pjp);
}
/**
* 拦截器具体实现
* @param pjp
* @return JsonResult(被拦截方法的执行结果)
*/
public Object Interceptor(ProceedingJoinPoint pjp){
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
MethodSignature signature = (MethodSignature) pjp.getSignature();
Method method = signature.getMethod(); //获取被拦截的方法
String methodName = method.getName(); //获取被拦截的方法名
String ip = request.getRemoteAddr();
String url = request.getRequestURL().toString();
logger.info("被调接口,请求开始----------------------------");
logger.info("ip : " + request.getRemoteAddr());
logger.info("url : " + request.getRequestURL().toString());
logger.info("methodName : " + methodName);
Object result = "";
String param = Arrays.toString(pjp.getArgs());
logger.info("param : " + param);
SysCallInterfaceLog log = new SysCallInterfaceLog();
log.setExt1("called");// 被叫
log.setRequestIp(ip);
log.setRequestMethod(methodName);
log.setRequestParam(param);
log.setRequestUrl(url);
try {
// 一切正常的情况下,继续执行被拦截的方法
result = pjp.proceed();
String resultStr = "";
if(result != null) {
if(result instanceof String) {
resultStr = (String) result;
} else {
Gson gson = new Gson();
resultStr = gson.toJson(result);
}
}
log.setResult(resultStr);
logger.info("result : " + resultStr);
logger.info("请求结束,请求成功");
// 记录结果到数据库
log.setSuccess("success");
log = sysCallInterfaceLogRepository.save(log);
} catch (Throwable e) {
logger.info("请求结束,请求失败");
// 记录结果到数据库, 并发送邮件
log.setSuccess("fail");
Gson gson = new Gson();
String exceptionStr = gson.toJson(e);
log.setResult(exceptionStr);
SysProperty sysPropertyName= sysPropertyService.getSysProperty("o2o.wms.log.name");
SysProperty sysPropertyEmail= sysPropertyService.getSysProperty("o2o.wms.log.email");
log = sysCallInterfaceLogRepository.save(log);
SysEmailDto sysEmailDto = new SysEmailDto();
List<SysEmailInfoDto> sysEmailInfoDtoLs = new ArrayList<SysEmailInfoDto>();
SysEmailInfoDto dtoDetails = new SysEmailInfoDto();
if(sysPropertyName !=null && sysPropertyEmail !=null){
dtoDetails.setReceiverEmail(sysPropertyEmail.getPropValue());
dtoDetails.setReceiverName(sysPropertyName.getPropValue());
}
sysEmailDto.setTitle("O2O调用WMS接口失败日志!");
sysEmailDto.setContent("调用:"+url+"失败!sys_Call_Interface_Log.Scil_Uuid="+log.getScilUuid()+",\n请求参数:"+param+",\n调用结果:"+exceptionStr);
sysEmailInfoDtoLs.add(dtoDetails);
sysEmailDto.setSysEmailInfoDto(sysEmailInfoDtoLs);
try {
sysEmailService.addSysEmail(sysEmailDto);
} catch (Exception e1) {
e1.printStackTrace();
}
e.printStackTrace();
throw new BusinessException(e, null, null);
}
return result;
}
}
spring Boot使用AOP统一处理Web请求日志记录的更多相关文章
- spring boot使用AOP统一处理web请求
为了保证服务的高可用,及时发现问题,迅速解决问题,为应用添加log是必不可少的. 但是随着项目的增大,方法增多,每个方法加单独加日志处理会有很多冗余 那在SpringBoot项目中如何统一的处理Web ...
- 46. Spring Boot中使用AOP统一处理Web请求日志
在之前一系列的文章中都是提供了全部的代码,在之后的文章中就提供核心的代码进行讲解.有什么问题大家可以给我留言或者加我QQ,进行咨询. AOP为Aspect Oriented Programming的缩 ...
- Springboot中使用AOP统一处理Web请求日志
title: Springboot中使用AOP统一处理Web请求日志 date: 2017-04-26 16:30:48 tags: ['Spring Boot','AOP'] categories: ...
- SpringBoot2.0 使用AOP统一处理Web请求日志(完整版)
一,加入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...
- Spring Boot中使用AOP统一处理Web请求日志
AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是Spring框架中的一个重要内容,它通 ...
- (转)Spring Boot中使用AOP统一处理Web请求日志
AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是Spring框架中的一个重要内容,它通 ...
- 转:Spring Boot中使用AOP统一处理Web请求日志
在spring boot中,简单几步,使用spring AOP实现一个拦截器: 1.引入依赖: <dependency> <groupId>org.springframewor ...
- Spring Boot2.0之统一处理web请求日志
试问,你的项目中,如果有几万个方法,你还这么写log.info("name"+name+",age"+age )日志么?low~ 所以用AOP呀 1.首先创建个 ...
- springboot Aop 统一处理Web请求日志
1.增加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...
随机推荐
- python列表[]中括号
names = ['jack', 'rose', 'tom', 'jerry', 'jerry'] print(names) print(names[0]) names[0] = 'adam' # 改 ...
- hpu 1267 Cafeteria (01背包)
1267: Cafeteria [DP] 时间限制: 1 Sec 内存限制: 128 MB提交: 76 解决: 31 统计 题目描述 Nanae把饥肠辘辘的josnch带去一家自助餐厅,面对面前眼花缭 ...
- 关于while(cin>>c)语句的理解
1.while(cin>>c)条件语句,其功能是检测输入流中的输入是否有效,若是文件结束标记或者非法输入,则条件判断为假,否则为真. 2.windows下的文件结束标记是Ctrl+z,Li ...
- python笔记01:基础知识
1.4 数字和表达式 # -*- coding:utf-8 -*- #1.4 #除法 print 1 / 2 print 1.0 / 2 print 10 / 3 print 10.0 / 3.0 p ...
- ACID测试标准
缩写ACID代表原子性(atomicity).一致性(consistency).孤立性(isolation).持久性(duration) 通过了ACID测试的事物在多线程.并行处理或多用户环境中就是安 ...
- 【Java集合的详细研究8】List,Set,Map用法以及区别
Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素.一些Collection允许相同的元素而另一些不行.一些能排序而另一些不行.Java ...
- DevExpress v17.2新版亮点—DevExtreme篇(一)
用户界面套包DevExpress DevExtreme v17.2终于正式发布,本站将以连载的形式为大家介绍各版本新增内容.本文将介绍了DevExtreme v17.2 的New Color Sche ...
- 强大的Grafana worldping插件
安装worldping插件: 官方插件地址 查看安装说明,在grafana server上执行命令,完成后重启grafana server,重启,请注意,要重启 重启grafana service g ...
- C高级第一次PTA作业
作业要求一 附加题目 写程序证明P++等价于(p)++还是等价于*(p++)? 1.设计思路: (1).题目算法描述 第一步:定义变量p并赋初值 第二步:分三次计算每次分别输出 p++,(p)++,* ...
- OK335xS UART device registe hacking
/************************************************************************* * OK335xS UART device reg ...