写在前面

如何将所有的通过url的请求参数以及返回结果都输出到日志中?

如果在controller的类中每个方法名都写一个log输出肯定是不明智的选择。使用Spring的AOP功能即可完成。

AOP 是 Aspect Oriented Program (面向切面)的编程的缩写。他是和面向对象编程相对的一个概念。在面向对象的编程中,我们倾向于采用封装、继承、多态等概念,将一个个的功能在对象中来实现。但是,我们在实际情况中也发现,会有另外一种需求就是一类功能在很多对象的很多方法中都有需要。例如有一些对数据库访问的方法有事务管理的需求,有很多方法中要求打印日志。按照面向对象的方式,那么这些相同的功能要在很多地方来实现或者在很多地方来调用。这就非常繁琐并且和这些和业务不相关的需求耦合太紧密了。所以后来就出现了面向切面的编程来解决这一类问题,并对面向对象的编程做了很好的补充

代码实现

1、在pom.xml中添加aspect依赖包。

 <!-- aop --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>

2、添加WebLogAspect类。

package com.fit.aop;import java.util.Enumeration;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 WebLogAspect {private static final Logger logger = LoggerFactory.getLogger(WebLogAspect.class);@Pointcut("execution(public * com.fit.controller.*.*(..))")public void webLog() {}/*** 使用AOP前置通知拦截请求参数信息*/@Before("webLog()")public void doBefore(JoinPoint joinPoint) throws Throwable {ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletRequest request = attributes.getRequest();logger.info("URL : " + request.getRequestURL().toString());logger.info("HTTP_METHOD : " + request.getMethod());logger.info("IP : " + request.getRemoteAddr());Enumeration<String> enu = request.getParameterNames();while (enu.hasMoreElements()) {String name = (String) enu.nextElement();logger.info("name:{},value:{}", name, request.getParameter(name));}}/*** 后置通知 * @param ret* @throws Throwable*/@AfterReturning(returning = "ret", pointcut = "webLog()")public void doAfterReturning(Object ret) throws Throwable {// 处理完请求,返回内容logger.info("RESPONSE : " + ret);}
}

3、UserController测试类

package com.fit.controller;import java.util.HashMap;
import java.util.Map;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;@Controller
public class UserController {@ResponseBody@RequestMapping(value = "getUser")public Map<String, Object> getUser() {Map<String, Object> user = new HashMap<String, Object>();user.put("name", "zlzhaoe");user.put("age", "21");return user;}
}

4、SpringBoot启动类

package com.fit;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class App {/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stubSpringApplication.run(App.class, args);}
}

5、启动App,访问http://localhost:8080/getUser,日志打印如下:

SpringBoot集成AOP管理日志相关推荐

  1. Spring Boot 入门(五):集成 AOP 进行日志管理

    本篇文章是接着 Spring boot 入门(四):集成 Shiro 实现登陆认证和权限管理写的,按照前面几篇博客的教程,可以搭建一个简单的项目,主要包含了 Pagehelper+MyBatis 分页 ...

  2. aop springboot 传入参数_java相关:springboot配置aop切面日志打印过程解析

    java相关:springboot配置aop切面日志打印过程解析 发布于 2020-3-31| 复制链接 摘记: 这篇文章主要介绍了springboot配置aop切面日志打印过程解析,文中通过示例代码 ...

  3. SpringBoot—集成AOP详解(面向切面编程Aspect)

    关注微信公众号:CodingTechWork,一起学习进步. AOP介绍 AOP概述   AOP是Aspect-Oriented Programming,即为面向(切面)方面编程.在维基百科中的解释: ...

  4. springboot使用AOP打印日志信息

    上一篇介绍了springboot整合Mybatis例子,这一篇在上一篇的基础上,简单修改部分实现日志信息的打印. 随着项目功能的一点点增加,打印日志信息就非常必要了,可以帮助我们很快确定哪里出现了问题 ...

  5. SpringBoot集成logback彩色日志配置以及banner启动设置(炫酷到爆炸!)

    文章目录 前言 一.banner配置 1.1 banner图像在线生成工具 1.2 banner配置颜色 1.3 banner启动状态控制 二.logback彩色日志配置 2.1 引入依赖 2.2 l ...

  6. SpringBoot/Cloud AOP 统一日志输出

    文章目录 1. 导入依赖 2. aop拦截器 3. logback配置 4. 测试类 5. 关键点 6. 效果图 1. 导入依赖 <!-- AOP --><dependency> ...

  7. spring-boot集成aop

    今年是2017年12月29日,是阳历17年最后一个工作日,写下今年最后一篇博客.回首一年过去,虽涉猎广泛,但仍感觉空乏.浪费,所学甚少.18年仍须"老夫聊发少年狂","西 ...

  8. springboot 集成mybatis时日志输出

    application.properties(yml)中配置的两种方式: 这两种方式的效果是一样的,但是下面一种可以指定某个包下的SQL打印出来,上面这个会全部的都会打印出来. 转载于:https:/ ...

  9. SpringBoot集成gRPC微服务工程搭建实践

    前言 本文将使用Maven.gRPC.Protocol buffers.Docker.Envoy等工具构建一个简单微服务工程,笔者所使用的示例工程是以前写的一个Java后端工程,因为最近都在 学习微服 ...

最新文章

  1. 数据结构及算法基础--优先队列(Priority Queue)
  2. viewpager 无网络的时候滑动异常
  3. 用gcc编译实现对Linux系统cpu占用
  4. kali linux 为firefox添加图标
  5. java jdk windows环境 下载安装配置环境变量
  6. poj2456 Aggressive cows(二分查找)
  7. Python 技术篇-用pytesseract库进行图像识别之环境配置
  8. nyoj 1261 音痴又音痴的LT(离散化+树状数组求K小数)
  9. python增量爬虫_python爬虫Scrapy框架之增量式爬虫
  10. IDEA 中 右键新建时,没有新建class的解决方案
  11. 如何写一个vue指令directive
  12. 怎样呵护友谊_呵护真正的友情,助力漫长的人生
  13. iOS开发之阿里百川、京东联盟、多多客联盟(拼多多)的接入
  14. Git 操作实战示例
  15. 一张图解AlphaGo原理及弱点
  16. Android陀螺仪加速度传感器
  17. 回荡口过新年,独特江南水乡年味体验 冰雪非遗贺新年,荡口古镇春节嗨不停!
  18. 领英给好友群发消息的方法和细节
  19. win10安装Hive3.0.0
  20. 【Apache NIFI 翻译】2-Getting Started with Apache NiFi 入门

热门文章

  1. 2022-2028年中国高纯铜市场研究及前瞻分析报告
  2. Go 学习笔记(67)— Go 并发安全字典 sync.Map
  3. CUDA之nvidia-smi命令详解---gpu
  4. pytorch中的transpose()
  5. line_profile逐行代码分析
  6. Gitea——私有git服务器搭建详细教程
  7. 探索 TVM 进行量化方法
  8. 将Tensor核心引入标准Fortran
  9. 计算机视觉一些项目实战技术
  10. 2021年大数据Kafka(五):❤️Kafka的java API编写❤️