利用spring AOP实现每个请求的日志输出
前提条件:
除了spring相关jar包外,还需要引入aspectj包。
- <dependency>
- <groupId>org.aspectj</groupId>
- <artifactId>aspectjweaver</artifactId>
- <version>1.7.2</version>
- </dependency>
要实现此功能,必须完成以下几步:
1.在springmvc-servlet.xml中实现对AOP的支持
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:aop="http://www.springframework.org/schema/aop"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
- xmlns:context="http://www.springframework.org/schema/context"
- xmlns:mvc="http://www.springframework.org/schema/mvc"
- xsi:schemaLocation="
- http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-4.0.xsd
- http://www.springframework.org/schema/mvc
- http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
- http://www.springframework.org/schema/aop
- http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">
- <aop:aspectj-autoproxy proxy-target-class="true"/>
- <bean class="com.yusj.interceptor.LogAspect" />
- .
- .
- .
- .
- </beans>
2.注解的方法实现Aspect
- package com.yusj.core.interceptor;
- import java.text.SimpleDateFormat;
- import java.util.HashMap;
- import java.util.Map;
- import javax.servlet.http.HttpServletRequest;
- import org.aspectj.lang.JoinPoint;
- import org.aspectj.lang.ProceedingJoinPoint;
- import org.aspectj.lang.annotation.After;
- import org.aspectj.lang.annotation.Around;
- import org.aspectj.lang.annotation.Aspect;
- import org.aspectj.lang.annotation.Before;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import org.springframework.web.context.request.RequestAttributes;
- import org.springframework.web.context.request.RequestContextHolder;
- import org.springframework.web.context.request.ServletRequestAttributes;
- import com.google.gson.Gson;
- /**
- *
- * @ClassName: LogAspect
- * @Description: 日志记录AOP实现
- * @author shaojian.yu
- * @date 2014年11月3日 下午1:51:59
- *
- */
- @Aspect
- public class LogAspect {
- private final Logger logger = LoggerFactory.getLogger(this.getClass());
- private String requestPath = null ; // 请求地址
- private String userName = null ; // 用户名
- private Map<?,?> inputParamMap = null ; // 传入参数
- private Map<String, Object> outputParamMap = null; // 存放输出结果
- private long startTimeMillis = 0; // 开始时间
- private long endTimeMillis = 0; // 结束时间
- /**
- *
- * @Title:doBeforeInServiceLayer
- * @Description: 方法调用前触发
- * 记录开始时间
- * @author shaojian.yu
- * @date 2014年11月2日 下午4:45:53
- * @param joinPoint
- */
- @Before("execution(* com.yusj.controller..*.*(..))")
- public void doBeforeInServiceLayer(JoinPoint joinPoint) {
- startTimeMillis = System.currentTimeMillis(); // 记录方法开始执行的时间
- }
- /**
- *
- * @Title:doAfterInServiceLayer
- * @Description: 方法调用后触发
- * 记录结束时间
- * @author shaojian.yu
- * @date 2014年11月2日 下午4:46:21
- * @param joinPoint
- */
- @After("execution(* com.yusj.controller..*.*(..))")
- public void doAfterInServiceLayer(JoinPoint joinPoint) {
- endTimeMillis = System.currentTimeMillis(); // 记录方法执行完成的时间
- this.printOptLog();
- }
- /**
- *
- * @Title:doAround
- * @Description: 环绕触发
- * @author shaojian.yu
- * @date 2014年11月3日 下午1:58:45
- * @param pjp
- * @return
- * @throws Throwable
- */
- @Around("execution(* com.yusj.controller..*.*(..))")
- public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
- /**
- * 1.获取request信息
- * 2.根据request获取session
- * 3.从session中取出登录用户信息
- */
- RequestAttributes ra = RequestContextHolder.getRequestAttributes();
- ServletRequestAttributes sra = (ServletRequestAttributes)ra;
- HttpServletRequest request = sra.getRequest();
- // 从session中获取用户信息
- String loginInfo = (String) session.getAttribute("username");
- if(loginInfo != null && !"".equals(loginInfo)){
- userName = operLoginModel.getLogin_Name();
- }else{
- userName = "用户未登录" ;
- }
- // 获取输入参数
- inputParamMap = request.getParameterMap();
- // 获取请求地址
- requestPath = request.getRequestURI();
- // 执行完方法的返回值:调用proceed()方法,就会触发切入点方法执行
- outputParamMap = new HashMap<String, Object>();
- Object result = pjp.proceed();// result的值就是被拦截方法的返回值
- outputParamMap.put("result", result);
- return result;
- }
- /**
- *
- * @Title:printOptLog
- * @Description: 输出日志
- * @author shaojian.yu
- * @date 2014年11月2日 下午4:47:09
- */
- private void printOptLog() {
- Gson gson = new Gson(); // 需要用到google的gson解析包
- String optTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(startTimeMillis);
- logger.info("\n user:"+userName
- +" url:"+requestPath+"; op_time:" + optTime + " pro_time:" + (endTimeMillis - startTimeMillis) + "ms ;"
- +" param:"+gson.toJson(inputParamMap)+";"+"\n result:"+gson.toJson(outputParamMap));
- }
- }
利用spring AOP实现每个请求的日志输出的更多相关文章
- 利用Spring AOP和自定义注解实现日志功能
Spring AOP的主要功能相信大家都知道,日志记录.权限校验等等. 用法就是定义一个切入点(Pointcut),定义一个通知(Advice),然后设置通知在该切入点上执行的方式(前置.后置.环绕等 ...
- 运用Spring Aop,一个注解实现日志记录
运用Spring Aop,一个注解实现日志记录 1. 介绍 我们都知道Spring框架的两大特性分别是 IOC (控制反转)和 AOP (面向切面),这个是每一个Spring学习视频里面一开始都会提到 ...
- spring AOP自定义注解方式实现日志管理
今天继续实现AOP,到这里我个人认为是最灵活,可扩展的方式了,就拿日志管理来说,用Spring AOP 自定义注解形式实现日志管理.废话不多说,直接开始!!! 关于配置我还是的再说一遍. 在appli ...
- 化繁就简,如何利用Spring AOP快速实现系统日志
1.引言 有关Spring AOP的概念就不细讲了,网上这样的文章一大堆,要讲我也不会比别人讲得更好,所以就不啰嗦了. 为什么要用Spring AOP呢?少写代码.专注自身业务逻辑实现(关注本身的业务 ...
- 我使用Spring AOP实现了用户操作日志功能
我使用Spring AOP实现了用户操作日志功能 今天答辩完了,复盘了一下系统,发现还是有一些东西值得拿出来和大家分享一下. 需求分析 系统需要对用户的操作进行记录,方便未来溯源 首先想到的就是在每个 ...
- 利用Spring AOP自定义注解解决日志和签名校验
转载:http://www.cnblogs.com/shipengzhi/articles/2716004.html 一.需解决的问题 部分API有签名参数(signature),Passport首先 ...
- (转)利用Spring AOP自定义注解解决日志和签名校验
一.需解决的问题 部分API有签名参数(signature),Passport首先对签名进行校验,校验通过才会执行实现方法. 第一种实现方式(Origin):在需要签名校验的接口里写校验的代码,例如: ...
- [编码实践]SpringBoot实战:利用Spring AOP实现操作日志审计管理
设计原则和思路: 元注解方式结合AOP,灵活记录操作日志 能够记录详细错误日志为运营以及审计提供支持 日志记录尽可能减少性能影响 操作描述参数支持动态获取,其他参数自动记录. 1.定义日志记录元注解, ...
- spring:利用Spring AOP 使日志输入与方法分离
对方法进行日志输出是一种很常见的功能.传统的做法是把输出语句写在方法体的内部,在调用该方法时,用输入语句输出信息来记录方法的执行! 1.先写一个普通类: package com.importnew; ...
随机推荐
- JavaScript函数的柯里化(currying)
转载请注明出处:http://www.cnblogs.com/shamoyuu/p/currying.html 什么是js函数的currying /柯里化? 说到js的柯里化,相信很多朋友都会头大.或 ...
- 重磅︱文本挖掘深度学习之word2vec的R语言实现
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 笔者寄语:2013年末,Google发布的 w ...
- 如何编译linux第一个模块 hellomod.ko
Linux下的驱动程序也没有听上去的那么难实现,我们可以看一下helloworld这个例子就完全可以了解它的编写的方式! 我们还是先看一个这个例子,helloworld 1. [代码]hellowor ...
- HighCharts之气泡图报错
HighCharts之气泡图报错 具体报错如下: uncaught exception: Highcharts error #17: www.highcharts.com/errors/17 ...
- ASP.NET Core轻松入门之Configure中IHostingEnvironment和IApplicationLifetime的使用
在StratUp.cs的Configure方法中,除了 常用的参数除了IApplicationBuilder和在我上一篇文章中提到的Iconfiguration点击打开链接 外 还有 IHostin ...
- 用VSCode开发一个基于asp.net core 2.0/sql server linux(docker)/ng5/bs4的项目(3)
第一部分: http://www.cnblogs.com/cgzl/p/8478993.html 第二部分: http://www.cnblogs.com/cgzl/p/8481825.html 由于 ...
- 6个重要的.NET概念: - 堆栈,堆,值类型,引用类型,装箱和拆箱(转)
今天在Code Project上面看到一篇文章<6 important .NET concepts: - Stack, heap, Value types, reference types, b ...
- RobotFramework下的http接口自动化post关键字的使用
在http协议中,除了get请求外,另一个最常用的就是post请求了.和get 请求类似,post请求接收一个参数,[ url ] 示例1:调用博客园(http://www.cnblogs.com/) ...
- Luogu4175:[CTSC2008]网络管理Network
题面 Luogu4175:[CTSC2008]网络管理Network Sol 路径第\(k\)大 无解直接判断就好了 然后整体二分,加上树链剖分+树状数组统计 # include <bits/s ...
- python中的小知识点
这里是一些小知识点的汇集,为的是以后查找的方便. 行与缩进: 物理行:实际看到的代码行数. 逻辑行:在意义上的函数(即解释器执行的行数) 如果一个物理行中包含了多个逻辑行,则每个逻辑行之间需要用分号 ...