springboot aop日志记录

标签: springboot aop 日志 | 发表时间:2018-12-10 19:35 | 作者:kuailenanhaier
出处:https://www.iteye.com
一、POM增加AOP JAR包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
<version>2.0.4.RELEASE</version>
</dependency>

二、Logweb类
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Logweb
{
    String value() default "";
}


三、SysAspect类
package cn.com.hfai.controller.system;

import java.util.Date;

import javax.servlet.http.HttpServletRequest;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;


@Aspect
@Component
public class SysAspect
{
    private static final Logger logger = LoggerFactory.getLogger(SysAspect.class);
   
    ThreadLocal<Long> startTime = new ThreadLocal<>();
           
    @Pointcut("@annotation(cn.com.hfai.controller.system.Logweb)")
    public void LogPointcut(){}

    @Before("LogPointcut()")
    public void doBefore(JoinPoint joinPoint) throws Throwable
    {
        startTime.set(System.currentTimeMillis());
        logger.info("====>>>>SysAspect doBefore");

        ServletRequestAttributes attribute = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();

        HttpServletRequest request = attribute.getRequest();
        logger.info("====>>>>request startTime::" + new Date());
        logger.info("====>>>>request URL::" + request.getRequestURL().toString());
        logger.info("====>>>>request method::" + request.getMethod());
        logger.info("====>>>>request IP::" + request.getRemoteAddr());
        logger.info("====>>>>request class method={}",joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
        logger.info("====>>>>request method paramter={}", joinPoint.getArgs());

    }

    @AfterReturning(returning = "ret", pointcut = "LogPointcut()")
    public void doAfterReturning(Object ret) throws Throwable
    {
        logger.info("====>>>>SysAspect doAfterReturning response::" + ret);
        logger.info("====>>>>response endTime::" + new Date());
        logger.info("====>>>>spend time::" + (System.currentTimeMillis()-startTime.get()));
    }
}

注:@annotation(cn.com.hfai.controller.system.Logweb) 一定要指定Logweb类

四、在Controller类的方法之上加上注解 @Logweb 即可

最后测试结果:
2018-12-10 19:34:59.929  INFO 11640 --- [nio-8080-exec-5] cn.com.hfai.controller.system.SysAspect  : ====>>>>SysAspect doBefore
2018-12-10 19:34:59.929  INFO 11640 --- [nio-8080-exec-5] cn.com.hfai.controller.system.SysAspect  : ====>>>>request startTime::Mon Dec 10 19:34:59 CST 2018
2018-12-10 19:34:59.930  INFO 11640 --- [nio-8080-exec-5] cn.com.hfai.controller.system.SysAspect  : ====>>>>request URL::http://localhost:8080/auth/userLogin
2018-12-10 19:34:59.930  INFO 11640 --- [nio-8080-exec-5] cn.com.hfai.controller.system.SysAspect  : ====>>>>request method::POST
2018-12-10 19:34:59.930  INFO 11640 --- [nio-8080-exec-5] cn.com.hfai.controller.system.SysAspect  : ====>>>>request IP::0:0:0:0:0:0:0:1
2018-12-10 19:34:59.931  INFO 11640 --- [nio-8080-exec-5] cn.com.hfai.controller.system.SysAspect  : ====>>>>request class method=cn.com.hfai.controller.user.UserController.userLogin
2018-12-10 19:34:59.931  INFO 11640 --- [nio-8080-exec-5] cn.com.hfai.controller.system.SysAspect  : ====>>>>request method paramter=org.apache.catalina.connector.RequestFacade@91d8135
2018-12-10 19:34:59.931  INFO 11640 --- [nio-8080-exec-5] cn.com.hfai.controller.system.SysAspect  : ====>>>>SysAspect doAfterReturning response::ModelAndView: reference to view with name 'home'; model is null
2018-12-10 19:34:59.931  INFO 11640 --- [nio-8080-exec-5] cn.com.hfai.controller.system.SysAspect  : ====>>>>response endTime::Mon Dec 10 19:34:59 CST 2018
2018-12-10 19:34:59.931  INFO 11640 --- [nio-8080-exec-5] cn.com.hfai.controller.system.SysAspect  : ====>>>>spend time::2


注:这个只是打印在控制台上,若想放到数据库中,则需要增加操作数据库的业务代码



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [springboot aop 日志] 推荐:

springboot aop日志记录

- - 编程语言 - ITeye博客
一、POM增加AOP JAR包. 三、SysAspect类. 注:@annotation(cn.com.hfai.controller.system.Logweb) 一定要指定Logweb类. 四、在Controller类的方法之上加上注解 @Logweb 即可. 注:这个只是打印在控制台上,若想放到数据库中,则需要增加操作数据库的业务代码.

SpringBoot 通过AOP实现数据库读写分离

- -
该方法是通过DataSourceAop拦截方法并设置Order注解保证该AOP在@Transactional之前执行,来实现数据库读写分离,另外的方法则是通过数据库中间件来实现,如proxysql、mycat、maxscale. . 1.0.18 .

使用AOP与注解记录Java日志

- - ImportNew
有些时候,我想要把每个运行过的方法接收到的参数、返回值和执行时间等信息记录(通过slf4j 和 log4j)下来. 在AspectJ、jcabi-aspects和Java注解的帮助下我实现了这个想法. 在log4j中可以看到以下输出:. 接下来我们来看看它是如何工作的. 注解是Java 6中采用的一种技术( 译注:其实Java 5就有注解了).

SpringBoot+Kafka+ELK 完成海量日志收集(超详细)

- - 掘金 架构
来源:jiandansuifeng.blog.csdn.net/article/details/107361190. 在这先列出各服务器节点,方便同学们在下文中对照节点查看相应内容. SpringBoot项目准备. 引入log4j2替换SpringBoot默认log,demo项目结构如下:. 测试Controller,用以打印日志进行调试.

spring mvc +spring aop结合注解的 用户操作日志记录

- - 行业应用 - ITeye博客
参考了网上的一些 文章 但是他们写的不是很全  自己也是经过了一些摸索  可以实现 记录 spring mvc controller层操作记录. 一个关注点的模块化,这个关注点可能会横切多个对象. 事务管理是J2EE应用中一个关于横切关注点的很好的例子. AOP中,切面可以使用通用类(基于模式的风格) 或者在普通类中以 @Aspect 注解(@AspectJ风格)来实现.

AOP详解

- - CSDN博客推荐文章
AOP(面向方面编程:Aspect Oriented Programing)和IoC一样是Spring容器的内核,声明式事务的功能在此基础上开花结果. 但是AOP和OOP差别较大,要很好地理解这个概念,做到心领神会还是不容易的,不过相信看完帖子,你就不再迷惑了. 编程语言最终极的目标就是能以更自然、更灵活的方式模拟世界,从原始机器语言到过程语言再到面向对象的语言,编程语言一步步地用更自然、更灵活的方式描述软件.

Spring AOP详解

- - Java - 编程语言 - ITeye博客
        最近项目中遇到了以下几点需求,仔细思考之后,觉得采用AOP来解决. 一方面是为了以更加灵活的方式来解决问题,另一方面是借此机会深入学习Spring AOP相关的内容. 例如,以下需求不用AOP肯定也能解决,至于是否牵强附会,仁者见仁智者见智. 1.对部分函数的调用进行日志记录,用于观察特定问题在运行过程中的函数调用情况.

SpringBoot-Metrics监控

- -
Metrics基本上是成熟公司里面必须做的一件事情,简单点来说就是对应用的监控,之前在一些技术不成熟的公司其实是不了解这种概念,因为业务跟技术是相关的. 当业务庞大起来,技术也会相对复杂起来,对这些复杂的系统进行监控就存在必要性了,特别是在soa化的系统中,完整一个软件的功能分布在各个系统中,针对这些功能进行监控就更必要了.

Spring AOP进行日志记录,管理 (使用Spring的拦截器功能获取对action中每个方法的调用情况,在方法调用前

- - 行业应用 - ITeye博客
原文地址: http://hi.baidu.com/wolf_childer/item/f0b5b0e664252cacc10d75d1.        在java开发中日志的管理有很多种. 我一般会使用过滤器,或者是Spring的拦截器进行日志的处理. 如果是用过滤器比较简单,只要对所有的.do提交进行拦截,然后获取action的提交路径就可以获取对每个方法的调用.

AOP的实现机制

- 风子 - ITeye论坛最新讨论
    附件中有本文的源代码和Pdf版. 本文写的很长的原因,是不希望大家学习AOP时到处找资料,大家有时间可以按照本文动手实践下,相信会有非常大的收获的,有什么问题互相交流,有问必答. AOP就是面向切面编程,我们可以从几个层面来实现AOP. 在编译器修改源代码,在运行期字节码加载前修改字节码或字节码加载后动态创建代理类的字节码,以下是各种实现机制的比较.