SpringBoot集成AOP管理日志
生活随笔
收集整理的這篇文章主要介紹了
SpringBoot集成AOP管理日志
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
寫在前面
如何將所有的通過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管理日志的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【微服务架构】SpringCloud之断
- 下一篇: Jquery实现form表单回填数据